04 - Conditions
Jusqu’ici, nos programmes exécutaient toutes les instructions dans l’ordre, de la première à la dernière. Mais un programme utile doit pouvoir prendre des décisions : un distributeur automatique vérifie que l’on a inséré assez d’argent avant de libérer un produit ; un site web affiche un message différent selon que l’on est connecté ou non. C’est le rôle des instructions conditionnelles.
L’indentation : un concept clé
En Python, l’indentation (les espaces en début de ligne) n’est pas un choix esthétique : elle est obligatoire et significative. C’est elle qui délimite les blocs d’instructions, c’est-à-dire les groupes d’instructions qui vont ensemble.
if age >= 18:
print("Vous êtes majeur") # ← dans le bloc if (4 espaces)
print("Bienvenue !") # ← dans le bloc if (4 espaces)
print("Fin du programme") # ← hors du bloc if (pas d'indentation)
Les deux premières instructions print ne s’exécutent que si la condition est vraie. La troisième s’exécute toujours, car elle n’est pas indentée dans le bloc.
Règles à retenir :
- on utilise quatre espaces par niveau d’indentation (convention standard en Python) ;
- toutes les instructions d’un même bloc doivent avoir exactement la même indentation ;
- une indentation incorrecte provoque une erreur
IndentationError.
if True:
print("ok")
print("erreur") # IndentationError : indentation inattendue
Dans d’autres langages (C, Java, JavaScript), les blocs sont délimités par des accolades { }. En Python, c’est l’indentation qui joue ce rôle. C’est ce qui rend le code Python particulièrement lisible, à condition de respecter cette règle.
L’instruction if
L’instruction if (« si ») exécute un bloc d’instructions uniquement lorsqu’une condition est vraie :
temperature = 35
if temperature > 30:
print("Il fait très chaud !")
print("Pensez à vous hydrater")
Il fait très chaud !
Pensez à vous hydrater
La condition temperature > 30 est une expression booléenne : elle vaut True ou False. Ici, 35 > 30 vaut True, donc le bloc indenté s’exécute. Les opérateurs de comparaison (==, !=, <, >, <=, >=) et les opérateurs logiques (and, or, not) utilisés dans les conditions sont détaillés dans le cours sur les opérateurs
.
Attention : ne pas confondre = (affectation) et == (comparaison d’égalité).
x = 5 # affectation : x prend la valeur 5
x == 5 # comparaison : vaut True car x vaut 5
L’instruction if...else
On veut souvent exécuter un bloc si la condition est vraie et un autre bloc si elle est fausse. C’est le rôle de else (« sinon ») :
age = 15
if age >= 18:
print("Vous êtes majeur")
else:
print("Vous êtes mineur")
Vous êtes mineur
Exactement l’un des deux blocs s’exécute : jamais les deux, jamais aucun.
L’instruction if...elif...else
Lorsqu’il y a plus de deux cas, on utilise elif (contraction de « else if ») pour tester des conditions supplémentaires :
note = 14
if note >= 16:
mention = "Très bien"
elif note >= 14:
mention = "Bien"
elif note >= 12:
mention = "Assez bien"
elif note >= 10:
mention = "Admis"
else:
mention = "Ajourné"
print(f"Résultat : {mention}")
Résultat : Bien
Python teste les conditions dans l’ordre, de haut en bas. Dès qu’une condition est vraie, le bloc correspondant s’exécute et tout le reste est ignoré. Si aucune condition n’est vraie, le bloc else s’exécute (s’il est présent).
Remarque importante : l’ordre des conditions compte. Ici, on teste d’abord note >= 16, puis note >= 14, etc. Si l’on inversait l’ordre en commençant par note >= 10, un élève ayant 18 entrerait dans ce premier cas et obtiendrait « Admis » au lieu de « Très bien ».
Conditions imbriquées
On peut placer un if à l’intérieur d’un autre if. Chaque niveau d’imbrication ajoute un niveau d’indentation :
age = 25
permis = True
if age >= 18:
if permis:
print("Vous pouvez conduire")
else:
print("Vous devez d'abord passer le permis")
else:
print("Vous êtes trop jeune pour conduire")
Vous pouvez conduire
Ici, on ne teste si la personne a le permis que si elle est majeure. L’imbrication traduit une hiérarchie de décisions : la question du permis ne se pose que pour les majeurs.
On peut souvent simplifier les conditions imbriquées avec and :
if age >= 18 and permis:
print("Vous pouvez conduire")
Mais la version imbriquée reste préférable lorsque les blocs else diffèrent selon le niveau, comme dans l’exemple ci-dessus.
Expressions ternaires
Pour les cas simples, Python permet d’écrire une condition sur une seule ligne avec une expression ternaire :
age = 20
statut = "majeur" if age >= 18 else "mineur"
print(statut)
majeur
La syntaxe est : valeur_si_vrai if condition else valeur_si_faux. C’est équivalent à :
if age >= 18:
statut = "majeur"
else:
statut = "mineur"
L’expression ternaire est pratique pour des affectations simples, mais il ne faut pas en abuser : dès que la logique devient complexe, un if...else classique est plus lisible.
Le mot-clé pass
Il est parfois utile d’écrire la structure d’un programme avant de remplir les blocs. Mais en Python, un bloc vide provoque une erreur. Le mot-clé pass sert de bloc vide volontaire :
age = 15
if age >= 18:
pass # on traitera ce cas plus tard
else:
print("Vous êtes mineur")
Vous êtes mineur
Erreurs fréquentes
Oublier les deux-points. La ligne if, elif ou else doit toujours se terminer par :.
if age >= 18 # SyntaxError : il manque les deux-points
print("ok")
Confondre = et ==. Écrire if x = 5 au lieu de if x == 5 provoque une erreur de syntaxe.
Mauvaise indentation. Mélanger espaces et tabulations, ou ne pas aligner les instructions d’un même bloc, produit une IndentationError.
Oublier que elif n’est pas if. Écrire plusieurs if successifs au lieu de elif fait que chaque condition est testée indépendamment, ce qui peut donner des résultats inattendus :
note = 18
# Incorrect : deux messages s'affichent
if note >= 10:
print("Admis")
if note >= 16:
print("Mention Très bien")
Admis
Mention Très bien
# Correct : un seul message
if note >= 16:
print("Mention Très bien")
elif note >= 10:
print("Admis")
Mention Très bien
Résumé
| Instruction | Syntaxe | Rôle |
|---|---|---|
if | if condition: | Exécute le bloc si la condition est vraie |
else | else: | Exécute le bloc si la condition du if est fausse |
elif | elif condition: | Teste une condition supplémentaire |
| Ternaire | a if cond else b | Condition en une ligne |
pass | pass | Bloc vide volontaire |