On a survolé le langage Python. On sait maintenant :
…
if temperature >= 30:
print('Il fait chaud')
else:
print('Il fait bon')
Programmer un ordinateur permet :
De nombreuses tâches implique une forme de répétition
En Python, l'instruction while permet de répeter un bloc d'instructions tant qu'une condition est vraie :
while e:
i1
…
in
isuite
Rappel : en Python, un bloc est un ensemble d'instructions
décalés de 4 espaces par rapport au début de la ligne.
Le bloc d'instructions i1,
…, in est réptété tant que e
s'évalue en True.
Le bloc d'instructions i1,
…, in est appelé le corps de la boucle.
Affichons la table de multiplication par 6 :
#fichier table_6.py
i = 0
print ('----------')
while i <= 10:
print (str(i) + ' * 6 = ' + str(i * 6))
i = i + 1
print ('----------')
$ python3 table_6.py
----------
0 * 6 = 0
1 * 6 = 6
2 * 6 = 12
3 * 6 = 18
4 * 6 = 24
5 * 6 = 30
6 * 6 = 36
7 * 6 = 42
8 * 6 = 48
9 * 6 = 54
10 * 6 = 60
----------
Lorsque l'on écrit « while e: » :
Exemple :
i = 0
print ('----------')
while i <= 10:
print (str(i) + ' * 6 = ' + str(i * 6))
i = i - 1
La boucle ci-dessus ne s'arrête jamais (l'utilisateur doit interrompre le programme avec CTRL-C dans le terminal.
Un motif très courant est la réptition pour un intervalle fixé, par pas constant. On peut utiliser pour cela l'instruction :
for var in range(debut, fin, pas):
i1
…
in
isuite
La variable var prend tour à tour les valeurs :
jusqu'à la valeur fin exclue.
for i in range(7, 22, 3):
print(str(i))
affiche :
7
10
13
16
19
ici 19 + 3 = 22, la borne supérieure étant exclue, on s'arrête à 19.
On peut écrire range(a, b) à la place de range(a, b, 1) et range(b) pour range(0, b, 1).
Le pas peut être négatif, dans ce cas, fin doit êtreinférieur à debut.
Si l'intervalle est vide on ne rentre pas dans la boucle.
Une structure de données est une façon d'organiser des valeurs, les relations entre ces dernières et les opérations permettant de les manipuler.
Une structure de données permet en particulier l'accès efficaces
aux données pour certaines utilisations.
Exemples de noms
de structures de données :
Un tableau permet de stocker une collection ordonnée et finie de valeurs et d'accéder efficacement à un élément arbitraire de la collection.
>>> tab = [1, 3, 5, 4, 19, 2]
>>> tab
[1, 3, 5, 4, 19, 2]
>>> tab[4]
19
>>> tab[4] = 42
>>> tab
[1, 3, 5, 4, 42, 2]
>>> t1 = [1, 2, 3]
>>> t2 = [4, 5, 6]
>>> t1 + t2
[1, 2, 3, 4, 5, 6]
>>> t3 = t1 + t2
>>> t3[0] = 10
>>> t3
[10, 2, 3, 4, 5, 6]
>>> t1
[1, 2, 3]
>>> [0] * 10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Il est courant de vouloir parcourir un tableau par indices croissants. On utilise simplement une boucle for:
for i in range(len(tab)):
# on peut utiliser tab[i] ici
On peut aussi parcourir par indices décroissants, en faisant attention :
for i in range(len(tab)-1, -1, -1):
# on peut utiliser tab[i] ici
Accéder à un indice supérieur ou égal à la taille est une erreur :
>>> tab = [1, 3, 5, 4, 19, 2]
>>> tab[7]
Traceback (most recent call last):
File "", line 1, in <module>
IndexError: list index out of range
>>> tab[-1]
2
>>> tab[-2]
19
>>> tab[-6]
1
>>> tab[-7]
Traceback (most recent call last):
File "", line 1, in <module>
IndexError: list index out of range
Les indices négatifs partent de la fin du
tableau. C'est dégueulassedangereux, non-intuitif, et
différent des autres langages. On n'utilisera pas ça, c'est moche.
Soit le tableau:
pda = [691165, 710534, ..., 2160] #106 valeurs en tout.
Dans la case i se trouve le nombre de personnes en France dont l'age est entre i et i+1. On souhaite écrire un programme qui donne le nombre de personne dont l'age est compris entre deux bornes, demandées à l'utilisateur.
entree = input('Age minimal ')
age_min = max(int(entree), 0) #on ne veut pas d'age négatif
entree = input('Age maximal ')
age_max = min(int(entree), len(pda)-1) #on ne veut pas d'age plus grand
#que ce qui est dans le tableau
total = 0
for i in range(age_min, age_max+1): #+1 car range exclut la borne sup.
total = total + pda[i]
print(str(total) + ' personnes ont entre ' + str(age_min) + ' et ' +
str(age_max) + ' ans')
En Python les erreurs autre que les erreurs de syntaxe s'appellent des exceptions.
Elle servent à signaler une situation « exceptionnelle ». Lorsqu'une telle erreur se produit, on dit que le programme a « levé une exception ».
>>> tab = [1, 3, 5, 4, 19, 2]
>>> tab[7]
Traceback (most recent call last):
File "", line 1, in <module>
IndexError: list index out of range
>>> 1/0
Traceback (most recent call last):
File "", line 1, in <module>
ZeroDivisionError: division by zero
>>> int('ABC')
Traceback (most recent call last):
File "", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'ABC'
On veut parfois vouloir gérer une erreur au moment où elle se produit. On peut pour cela utiliser la construction try/except.
try:
i1
…
in
except E:
j1
…
jm
Le bloc i1, …, in est
exécuté. Si une instruction lève l'exception E, alors il
s'interrompt et le bloc j1,
…, jm est exécuté.
On utilisera cette construction à des endroits bien choisis, sans en
abuser (généralement indiqués par l'énoncé de l'exercice). En
général pour rattraper une ValueError levée par la
fonction int().
try:
age = int(input('Entrer votre age : '))
except ValueError:
age = 20 #Valeur par défaut en cas d'erreur de int()
#c'est à dire, si l'utilisateur n'a pas saisi
#un age valide.
On souhaite écrire le programme « trouve le nombre » qui :
De plus, on souhaite que le programme re-demande la saisie en cas d'erreur (i.e. si l'utilisateur ne saisi pas un entier correct).
from random import randint
n = randint(0, 100)
# n contient un entier aléatoire entre 0 et 100 inclus
Pour le reste, démo (et voir le fichier final devine.py)
* : bien des choses ont été passées sous silence. Elles seront expliquées au fur et à mesure.