Instruction conditionnelle
Maintenant que l'on maitrise les expressions booléennes, on va pouvoir les utiliser pour n'exécuter une partie de programme que si une certaine condition est satisfaite grâce aux instructions conditionnelles.
Instruction if
Commençons avec un exemple qui teste la valeur d'une variable x
et affiche une phrase seulement si cette valeur est négative :
L'exécution de ce programme produit la sortie suivante :
x est négatif ! Sa valeur absolue vaut 5
L'instruction if
se compose du mot réservé if
suivi d'une condition, puis du caractère deux-points (:
) et enfin d'une séquence d'instructions à exécuter si la valeur de la condition est vraie. Comme vous l'avez remarqué, pour distinguer les instructions à exécuter si la condition est satisfaite, elles sont indentées, c'est-à-dire précédées de plusieurs espaces. La figure 5 montre l'organigramme correspondant à ce programme.
Toutes les instructions à exécuter si la condition est satisfaite forment un ensemble appelé bloc de code. Elles doivent toutes être indentées de la même manière, par exemple avec une tabulation horizontale ou avec deux espaces, sans quoi une erreur se produira. Si l'on se réfère au guide de style de Guido van Rossum, il faut utiliser quatre espaces par niveau d'indentation.
La condition d'une instruction if
est généralement une expression booléenne. Si la valeur de l'expression est True
, la condition est satisfaite et le bloc de code du if
est exécuté, sinon il est ignoré. Dans tous les cas, le programme continue ensuite son exécution après l'instruction if
.
Exécution alternative
En plus d'un bloc de code qui n'est exécuté que si une condition est satisfaite, on peut également définir un second bloc qui ne sera exécuté que dans le cas contraire, c'est-à-dire si la condition n'est pas satisfaite. Une telle exécution alternative se déclare avec le mot réservé else
.
Voici un exemple de programme qui utilise une instruction if-else
:
Le bloc if
sera donc exécuté si la condition placée après le mot réservé if
est satisfaite, et sinon, c'est le bloc else
qui sera exécuté. Ensuite, le programme continue son exécution après l'instruction if-else
. La figure 6 montre l'organigramme correspondant à ce programme.
Imbrication d'instructions
Avec ce qu'on vient de voir, on peut donc définir une ou deux branches d'exécution différentes, en fonction de la valeur d'une condition. Comment pourrait-on faire si on désire plus de deux branches ?
Supposons que l'on souhaite écrire un programme qui contrôle la température de l'huile d'un moteur d'une voiture. Tant que celle-ci est sous les $100^\circ$C, tout est normal, si elle est entre $100^\circ$C et $130^\circ$C, il faut émettre un avertissement et enfin si elle dépasse les $130^\circ$C, il faut faire retentir une alarme de danger.
Pour cela, on va utiliser deux instructions if-else
que l'on va imbriquer l'une dans l'autre. Ce qu'on va faire, c'est qu'on va utiliser comme contenu du bloc else
de la première instruction if-else
, une seconde instruction if-else
:
La figure 7 montre l'organigramme de ce programme. Les deux instructions if-else
y sont encadrées, ce qui fait bien ressortir qu'elles sont imbriquées l'une dans l'autre. La seconde a été imbriquée dans le bloc else
, mais on aurait très bien pu la placer dans le bloc if
si on voulait. La raison pour laquelle on ne l'a pas fait est que Python propose une écriture simplifiée lorsque l'imbrication se fait dans le bloc else
.
Vous aurez remarqué que comme le contenu du bloc else
est une instruction if-else
, cette dernière doit être indentée. Par conséquent, les instructions des blocs if
et else
de cette dernière ont un niveau d'indentation double. Si on continue à ajouter d'autres branches, on va se retrouver avec des niveaux d'indentation trop grands. Pour éviter cela, Python propose l'instruction elif
(contraction de else if
) permettant une écriture simplifiée des instructions conditionnelles à plus de deux branches. L'exemple précédent se réécrit comme suit :
On est maintenant capable d'écrire un programme complet pour chercher les racines d'un trinôme du second degré, dont le code se trouve au listing de la figure 8. Faites attention aux commentaires qui ont été utilisés, ainsi qu'à la mise en page globale du code.