Contrôle de l’exécution d’un programme
Une vidéo de présentation des structures de contrôle…
Comme tout langage de programmation, Python possède les deux structures de contrôle élémentaires permettant l’exécution de programmes complexes :
l’exécution conditionnelle d’un bloc d’instruction ;
la répétition d’instructions.
Ces structures de contrôles sont similaires dans leur architecture à celles disponibles dans d’autres langages. Deux choses les distinguent cependant:
la syntaxe : en particulier le parenthésage n’est pas requis pour des expressions simples ;
les blocs d’instructions sont définis par l’indentation et non par une paire d’accolades.
Le test conditionnel : if
Le test conditionnel s’effectue avec l’instruction classique if
qui évalue une expression logique (booléenne) et exécute les instructions du bloc si elle est vraie. Par exemple:
>>> x = int(input("Entrez un entier: "))
Entrez un entier: 16
>>> if x%2 == 0:
... print(x, " est pair")
...
16 est pair
Si la condition est fausse, les instructions du bloc else
sont exécutées:
>>> x = int(input("Entrez un entier: "))
Entrez un entier: 17
>>> if x%2 == 0:
... print(x, " est pair")
... else:
... print(x, "est impair")
...
17 est impair
D’autres alternatives sont possibles avec une ou plusieurs instructions elif
. L’utilisation de elif
évite l’imbrication de plusieurs blocs if
.
Un test conditionnel est composé de :
1 instruction
if
assortie d’une expression logique (on dit aussi prédicat) ;0, 1 ou plusieurs instructions
elif
, chacune assortie d’une expression logique ;0 ou 1 instructions
else
.
Important
Python évalue chaque expression logique associée aux instructions if
, elif
dans l’ordre où il les rencontre. Il exécute le bloc correspondant à la première expression logique évaluée à True
puis sort du bloc (les expressions logiques suivantes ne sont pas évaluées). Si toutes les expressions logiques sont évaluées à False
, le bloc else
est exécuté (s’il est présent)
if False:
print('if')
elif True:
print('elif1')
elif True:
print('elif2')
else:
print('else')
Bien que l’expression logique de la deuxième instruction elif
soit True
, le bloc correspondant n’est jamais exécuté.
A expérimenter…
Modifier les prédicats ci dessus et observer le comportement du test conditionnel.
Python ne possède pas d’instruction switch
comme ce peut être le cas dans d’autres languages. Sa déclinaison en une séquence if
… elif
… est fonctionnelle mais lourde. Une implémentation très compacte est possible à partir d’un dictionnaire, comme on le verra dans le paragraphe Implémentation de switch.
La répétition d’instructions : for
En Python for
permet d’itérer sur tout type de séquence, et exploite l’élément plutôt que l’indice de l’élément, comme c’est généralement le cas dans d’autres langages. C’est très efficace, car dans la très grande majorité des cas, l’indice n’est utile que pour accéder à l’élément. On retrouve ce comportement assez souvent en Python, où des instructions de plus haut niveau sont utilisées par défaut.
Note
Les informations bas niveau (les indices) sont accessibles si besoin avec la fonction enumerate()
.
La boucle for
s’écrit de façon similaire, quel que soit le type de séquence sur laquelle on souhaite itérer:
>>> for i in range(0,5):
... print(i, i**2)
...
0 0
1 1
2 4
3 9
4 16
Note
La fonction range()
retourne un itérateur sur une séquence d’entiers. L’indice de départ est inclus, l’indice de fin est exclus. C’est un comportement général en Python.
Modification du comportement de la boucle
Il existe deux façons de modifier le comportement d’une boucle for
.
L’instruction break
L’instruction break
permet de quitter la boucle prématurément.
1for i in range(5):
2 if i == 3:
3 break
4 print(i, i**2)
5
60 0
71 1
82 4
L’instruction continue
L’instruction continue
permet de passer à l’itération suivante sans exécuter les instructions du corps de boucle qui suivent.
1for i in range(5):
2 if i == 3:
3 continue
4 print(i, i**2)
5
60 0
71 1
82 4
94 16
La clause else
La boucle for
comporte une clause else
permettant l’exécution d’une instruction (ou d’un bloc d’instructions) lorsque la totalité de la boucle a été parcourue.
1for i in range(5):
2 print(i, i**2)
3 if i == 9: # cette condition n'est jamais vérifiée
4 break
5else:
6 print("La boucle est complètement exécutée")
7
8print("suite du programme")
9
100 0
111 1
122 4
133 9
144 16
15La boucle est complètement exécutée
16suite du programme
Au contraire, si la boucle for
n’a pas été complètement parcourue, l’instruction contenue dans la clause else
n’est pas exécutée.
1for i in range(5):
2 print(i, i**2)
3 if i == 3:
4 break
5else:
6 print("La boucle est complètement exécutée")
7
8print("suite du programme")
9
100 0
111 1
122 4
133 9
14suite du programme
La répétition d’instructions : while
L’instruction while
permet également la répétition d’instructions comme on vient de le voir pour l’instruction for
. Les deux instructions permettant des constructions équivalentes, le choix entre les deux sera affaire de concision et de clarté.
Ainsi, lorsque l’on aura à parcourir une séquence dont la longueur est connue avant l’exécution de la boucle, il sera plus pertinent d’utiliser une boucle for
.
A contrario, lorsque le nombre d’itérations n’est pas connu à l’avance et dépend d’une condition évaluée dynamiquement à l’intérieur de la boucle, l’instruction while
permettra une écriture plus naturelle. Un exemple avec la suite de Syracuse.
1s = 9
2while s != 1:
3 if s % 2 == 0:
4 s = s // 2
5 else:
6 s = 3 * s + 1
7 print(s, end=" ")
8print()
9
1028 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Note
La conjecture de Syracuse est l’hypothèse mathématique selon laquelle la suite de Syracuse de n’importe quel entier n
strictement positif finit par atteindre 1. En mathématiques, une conjecture est une assertion pour laquelle on ne connaît pas encore de démonstration, mais que l’on soupçonne d’être vraie, en l’absence de contre-exemple.
La boucle while
dispose également des instructions break
et continue
pour modifier son comportement.
Dans le code ci dessous, la boucle s’arrête prématurément si le nombre 17
est trouvé dans la séquence.
1n = 9
2while n != 1:
3 if n == 17:
4 break
5 if n % 2 == 0:
6 n = n // 2
7 else:
8 n = 3 * n + 1
9 print(n, end=" ")
10print()
11
1228 14 7 22 11 34 17
Ce qu’il faut retenir
Les 3 instructions peuvent être utilisées dans un test conditionnel
Les 2 instructions peuvent être utilisées pour la répétition d’instructions
L’instruction associée à
for
permet d’exécuter un bloc d’instructions si la boucle n’a pas été interrompueUn test conditionnel peut contenir plusieurs instructions
if
Un test conditionnel peut contenir plusieurs instructions
elif
Un test conditionnel peut contenir plusieurs instructions
else
Toutes les expressions logiques d’un test conditionnelles sont évaluées
Si on connaît a priori le nombre d’itérations à exécuter, le choix d’une boucle est pertinent
Si on ne connaît pas a priori le nombre d’itérations à exécuter, le choix d’une boucle est pertinent
Une répétition d’instruction écrite avec
for
peut également être écrite avecwhile
Une répétition d’instruction écrite avec
while
peut également être écrite avecfor
La bonne pratique d’utilisation d’une boucle
for
est de manipuler les indicesL’utilisation de l’instruction
break
dans une bouclefor
ouwhile
permet d’interrompre définitivement le parcours de la boucleL’utilisation de l’instruction
continue
dans une bouclefor
ouwhile
permet d’interrompre momentanément le parcours de la boucle