# -*- coding: ascii -*-
str
d'un script Python utilisent cet encodage par défaut.texte_en_utf8 = "Bonjour !"
texte_en_ascii = texte_en_utf8.encode("ascii")
print(texte_en_ascii)
b'Bonjour !'
Le préfixe b
signifie qu'il s'agit d'une chaîne binaire.
stdin
(index 0) : entrée texte standard.stdout
(index 1) : sortie texte standard.stderr
(index 2) : sortie d'erreur standard.stdin
stdin
est une redirection vers le périphérique clavier.stdin
signifie donc que l'on va lire ce que l'utilisateur écrit.input
pour lire dans stdin
:nom = input("Votre nom : ")
stdout
stdout
est une redirection vers la console.stdout
va afficher le contenu dans la console.print
pour écrire dans stdout
:nom = input("Votre nom : ")
print(nom)
stderr
stderr
, tout comme stdout
, est une redirection vers la console.stderr
va afficher le contenu dans la console.stderr
par défaut.sys.stderr.write
:import sys
sys.stderr.write("Oh mince ! dit Shipper")
age_en_texte = input("Votre age : ")
age = int(age_en_texte)
print("Vous avez", age, "ans")
"Vous avez 42 ans"
(si age == 42
)
ht = 69.5
tva = 1/5
taxe = round(ht * tva * 100) / 100
ttc = ht + taxe
label_ht = "Prix (HT) : "
label_ttc = "Prix (TTC) : "
print(label_ht, ht, "€\n", label_ttc, ttc, "€")
Prix (HT) : 69.5 €
Prix (TTC) : 83.4 €
ht = 69.5
tva = 1/5
taxe = round(ht * tva * 100) / 100
label_ht = "Prix (HT) :"
label_ttc = "Prix (TTC) :"
print(f"{label_ht:>12} {ht:.2f}€\n{label_ttc:>12} {ht + taxe:.2f}€")
Prix (HT) : 69.50€
Prix (TTC) : 83.40€
nombre = int(input("Entrez un nombre positif : "))
resultat = 0
if nombre == 1:
resultat = 1
elif nombre == 2:
resultat = 1 + 2
elif nombre == 3:
resultat = 1 + 2 + 3
elif nombre == 4:
resultat = 1 + 2 + 3 + 4
# etc.
print(resultat)
On souhaite en fait ici exprimer :
Le commentaire # etc.
dans la diapositive précédente ou l'ellipse ...
dans la formule ci-dessus expriment tous les 2 une répétition.
Une boucle "Tant Que" peut s'exprimer ainsi en pseudo-code :
Tant Que la valeur de l'expression Test est Vraie:
Exécute le Corps de la Boucle
En anglais : tant que
while
nombre = int(input("Entrez un nombre : "))
resultat = 0
i = 0
while i <= nombre:
resultat += i
i += 1
print(resultat)
45
si nombre == 9
Itération | i | resultat | nombre |
---|---|---|---|
0 | 0 | 0 | 9 |
1 | 1 | 1 | 9 |
2 | 2 | 3 | 9 |
3 | 3 | 6 | 9 |
4 | 4 | 10 | 9 |
5 | 5 | 15 | 9 |
6 | 6 | 21 | 9 |
7 | 7 | 28 | 9 |
8 | 8 | 36 | 9 |
9 | 9 | 45 | 9 |
nombre = 9
resultat = 0
i = 0
while i <= nombre:
resultat += i
i -= 1
from math import sin
pi = 3.14159265
epsilon = 1e-6
actuel = -2 * pi
fin = 2 * pi
increment = pi / 6
while actuel < fin:
sin_actuel = sin(actuel)
precedent = actuel
actuel += increment
if abs(sin_actuel) < epsilon: # si sin(actuel) est proche de 0
continue # évite les instructions suivantes
valeur = 1 / sin_actuel
print(f"x = {precedent:>9.6f} ;"
f" sin(x) = {sin_actuel:>9.6f} ;"
f" 1 / sin(x) = {valeur:>9.6f}")
x = -5.759587 ; sin(x) = 0.500000 ; 1 / sin(x) = 2.000000
x = -5.235988 ; sin(x) = 0.866025 ; 1 / sin(x) = 1.154701
x = -4.712389 ; sin(x) = 1.000000 ; 1 / sin(x) = 1.000000
x = -4.188790 ; sin(x) = 0.866025 ; 1 / sin(x) = 1.154701
x = -3.665191 ; sin(x) = 0.500000 ; 1 / sin(x) = 2.000000
x = -2.617994 ; sin(x) = -0.500000 ; 1 / sin(x) = -2.000000
x = -2.094395 ; sin(x) = -0.866025 ; 1 / sin(x) = -1.154701
x = -1.570796 ; sin(x) = -1.000000 ; 1 / sin(x) = -1.000000
x = -1.047198 ; sin(x) = -0.866025 ; 1 / sin(x) = -1.154701
x = -0.523599 ; sin(x) = -0.500000 ; 1 / sin(x) = -2.000000
x = 0.523599 ; sin(x) = 0.500000 ; 1 / sin(x) = 2.000000
x = 1.047198 ; sin(x) = 0.866025 ; 1 / sin(x) = 1.154701
x = 1.570796 ; sin(x) = 1.000000 ; 1 / sin(x) = 1.000000
x = 2.094395 ; sin(x) = 0.866025 ; 1 / sin(x) = 1.154701
x = 2.617994 ; sin(x) = 0.500000 ; 1 / sin(x) = 2.000000
x = 3.665191 ; sin(x) = -0.500000 ; 1 / sin(x) = -2.000000
x = 4.188790 ; sin(x) = -0.866025 ; 1 / sin(x) = -1.154701
x = 4.712389 ; sin(x) = -1.000000 ; 1 / sin(x) = -1.000000
x = 5.235988 ; sin(x) = -0.866025 ; 1 / sin(x) = -1.154701
x = 5.759587 ; sin(x) = -0.500000 ; 1 / sin(x) = -2.000000
x = 1000 * 1000 * 1000
while True:
if (x % 11 == 0) and (x % 27 == 0):
break
x -= 1
print(f"{x} est dans la table des 11 et des 27")
"999999891 est dans la table des 11 et des 27"
i = 1
while i < 4:
line = ""
j = 1
while j < 4:
line += f"{i * j:>3}"
j += 1
print(line)
i += 1
1 2 3
2 4 6
3 6 9
Admettons que nous ayons une liste de noms que nous souhaitons afficher dans la console :
liste = [ "Alan", "Ada", "Donald" ]
taille = len(liste)
i = 0
while i < taille:
nom = liste[i]
print(nom)
i += 1
Alan
Ada
Donald
for nom in [ "Alan", "Ada", "Donald" ]:
print(nom)
Alan
Ada
Donald
Une boucle "Pour" peut s'exprimer ainsi en pseudo-code :
Pour chaque élément du containeur:
Exécute le Corps de la Boucle sur cet élément
En anglais : pour
for
for i in { 1, 2, 3 }:
print(i)
1
2
3
somme = 0
for i in { 1, 2, 3, 4, 5, 6, 7, 8, 9 }:
somme += i
print(somme)
45
taille = int(input("Taille : "))
somme = 0
# for i in { 1, 2, 3, 4, 5, ..., taille }: # ce code est commenté
# somme += i # comment fait-on ?
print(somme)
La fonction range
permet de résoudre ce problème.
En anglais : borne
range
.
taille = int(input("Taille : "))
somme = 0
for i in range(taille + 1):
somme += i
print(somme)
for i in range(3):
print(i)
0
1
2
Autrement dit :
debut = 1
fin = 3
for i in range(debut, fin):
print(i)
1
2
Autrement dit :
debut = 1
fin = 6
pas = 2
for i in range(debut, fin, pas):
print(i)
1
3
5
Comment feriez-vous pour ré-implémenter le TP 01 Anjou Vélo Vintage en Python ?
from math import sin
var1=3.14159265;var2=1e-6;var3=-2*var1;var4=2*var1;var5=var1/6
while var3<var4:
var6=sin(var3);var7=var3;var3+=var5
if abs(var6)<var2:continue
var8=1/var6
print(f"var7={var7};var6={var6};var8={var8}")
Que fait-il ?
from math import sin
pi = 3.14159265
epsilon = 1e-6
actuel = -2 * pi
fin = 2 * pi
increment = pi / 6
while actuel < fin:
sin_actuel = sin(actuel)
precedent = actuel
actuel += increment
if abs(sin_actuel) < epsilon: # si sin(actuel) est proche de 0
continue # évite les instructions suivantes
valeur = 1 / sin_actuel
print(f"x = {precedent:>9.6f} ;"
f" sin(x) = {sin_actuel:>9.6f} ;"
f" 1 / sin(x) = {valeur:>9.6f}")
# Les commentaires commencent par le caractère "#".
# Ils ne sont pas exécutés par l'interpréteur Python.
une_ligne = "peut commencer" # par des instructions
# qui s'exécutent et
# se terminent par des
# commentaires.
Grandes lignes dans les prochaines diapositives
On utilise 4 espaces pour l'indentation.
Maximum 79 caractères par ligne au total.
revenus = (salaire_net
+ interets_comptes_bancaires
- impots_revenus
- remboursements_emprunt)
Faisons sifler les serpents !
Cela ne voudrait de toutes façons rien dire. Mieux vaut interdire une syntaxe sans sémantique.
UTF-8 ne permet pas de représenter tous les symboles de toutes les langues. Il existe de très nombreux autres formats d'encodage. Certains formats sont populaires pour certaines langues. Par défaut, Python utilise UTF-8.
Nous reviendrons plus tard sur le type binaire.
Extensions disponibles pour presque tous les langages de programmation. Excellent support de Python. Vous pourrez l'utiliser sans problème pour vos projets professionnels. Est utilisé notamment pour l'édition de ce cours.
Evidemment, on pourrait faire `sum(range(nombre + 1))` si on avait déjà quelques connaissances plus avancées. Mais ici, on se pose la question de l'implémentation de sum.
`i` ne fait que diminuer. `i` reste donc indéfiniment plus petit que `nombre`. La condition de fin de la boucle n'est jamais atteinte.
sin(pi/2) == 0. En partant de -2*pi, et avec un increment de pi/6, on va passer par pi/2 et -pi/2. Donc, on pourrait arriver sur des divisions par zéro. Avec les erreurs numériques, la probabilité de tomber sur une division par zéro est faible. En revanche, on observerait des valeurs immenses en divisant par des nombres proches de zéro. Pratique pour éviter des valeur gênantes sans toutefois arrêter la boucle.
On cherche ici le plus grand nombre inférieur à 1 milliard qui soit divible par 11 et 27. L'instruction break arrête la boucle. Cette instruction permet d'ajouter des conditions de fin au cours de l'exécution d'une itération.
On peut tout faire avec des boucles while. On remarque que pour un cas simple comme celui-ci, on est obligé d'utiliser un index i et de calculer explicitement la borne de fin.
On peut également itérer sur des entiers.
Si on connait la borne supérieure, on peut lister tous les nombres par lesquels on doit passer.
On se retrouve à nouveau coincé : soit on retourne sur des boucles while, soit il nous faut un autre concept pour générer un ensemble d'entiers.
Va de 0 au nombre indiqué moins 1.
Extensions disponibles pour presque tous les langages de programmation. Excellent support de Python. Vous pourrez l'utiliser sans problème pour vos projets professionnels. Est utilisé notamment pour l'édition de ce cours.
Assez similaire finalement. Scratch vous oriente pour empêcher les erreurs de syntaxe. Rechercher les blocs prend beaucoup de temps. Ecrire les algorithmes dans un éditeur de texte est beaucoup plus rapide.
Scratch oriente encore une fois pour empêcher les erreurs de syntaxe. Scratch propose des choses non disponibles par défaut dans Python : attendre une collision par exemple. C'est parce que Scratch est à la fois un langage et une boîte à outils pour le développement de jeux vidéos.
Personnellement, je commencerais par pip install PyGame, qui est une boîte à outils pour créer des jeux vidéos simples en Python. PyGame est plus complexe que Scratch, mais il permet d'aller beaucoup plus loin, par exemple en créant des jeux 3D.
Qu'en déduisez-vous ?
Une mauvaise image de marque implique au final moins de ventes, et donc également un coût.
L'une des questions philosophiques entre programmeurs...