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
ifassortie 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
Voir aussi
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
La clause else
Comme pour la boucle for, la boucle while 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, c’est à dire sans jamais rencontrer l’instruction break. Le corollaire de ceci est qu’il est inutile d’utiliser une clause else si l’instruction break n’est pas présente dans le code de la boucle.
1n = 9
2while n != 1:
3 if n % 2 == 0:
4 n = n // 2
5 else:
6 n = 3 * n + 1
7 print(n, end=" ")
8else:
9 print("\nLa boucle est complètement exécutée")
10
1128 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
12La boucle est complètement exécutée
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 à
forpermet d’exécuter un bloc d’instructions si la boucle n’a pas été interrompueUn test conditionnel peut contenir plusieurs instructions
ifUn test conditionnel peut contenir plusieurs instructions
elifUn test conditionnel peut contenir plusieurs instructions
elseToutes 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
forpeut également être écrite avecwhileUne répétition d’instruction écrite avec
whilepeut également être écrite avecforLa bonne pratique d’utilisation d’une boucle
forest de manipuler les indicesL’utilisation de l’instruction
breakdans une boucleforouwhilepermet d’interrompre définitivement le parcours de la boucleL’utilisation de l’instruction
continuedans une boucleforouwhilepermet d’interrompre momentanément le parcours de la boucle