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 ifelif … 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é interrompue

  • Un 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 avec while

  • Une répétition d’instruction écrite avec while peut également être écrite avec for

  • La bonne pratique d’utilisation d’une boucle for est de manipuler les indices

  • L’utilisation de l’instruction break dans une boucle for ou while permet d’interrompre définitivement le parcours de la boucle

  • L’utilisation de l’instruction continue dans une boucle for ou while permet d’interrompre momentanément le parcours de la boucle