Prendre des décisions — if, elif, else
Emprunter différents chemins selon une condition, pourquoi l'indentation a un sens en Python, et le bug silencieux qui vient d'un mauvais ordre des conditions.
Comment voulez-vous apprendre ?
Le problème que nous résolvons
Dans le chapitre précédent, nous avons appris à poser des questions : age >= 18 est-il vrai ou faux ? Mais une fois la réponse connue, le programme ne faisait rien avec elle ; il se contentait d'afficher True ou False.
Il est maintenant temps d'agir selon cette réponse. Un chemin si la condition est vraie, un autre si elle ne l'est pas. C'est le moment où le code cesse d'être une simple liste d'étapes et commence à prendre des décisions.
Et là, Python se distingue de beaucoup d'autres langages : ce sont les espaces en début de ligne (l'indentation) qui déterminent quelles lignes font partie d'une condition et lesquelles n'en font pas partie. Il n'y a pas d'accolades {}. Cela paraît étrange au début, puis on finit par l'apprécier, car un code qui a l'air organisé est un code organisé.
À la fin de ce chapitre, vous pourrez
- Exécuter du code selon une condition avec
if - Prévoir une alternative avec
else, et plusieurs avecelif - Bien indenter, et lire et corriger une
IndentationError - Expliquer pourquoi l'ordre des conditions compte — le piège le plus important ici
- Imbriquer une condition dans une autre, et reconnaître quand il vaut mieux l'éviter
Prérequis : True et False — apprendre à poser des questions.
La forme la plus simple
age = 22
if age >= 18:
print("You may enter")
print("Program finished")You may enter
Program finishedLa structure comporte trois éléments :
- Le mot
if, suivi d'une condition - Un deux-points
:à la fin de la condition — l'oublier est l'erreur la plus fréquente - Les lignes qui suivent, indentées de quatre espaces — ce sont ces lignes indentées que la condition contrôle
Si age avait valu 15, le premier print n'aurait pas été exécuté, mais le dernier l'aurait été quand même, car il se trouve en dehors de la condition.
L'indentation fait le sens
Ces deux programmes ont presque les mêmes caractères et se comportent pourtant de façon totalement différente :
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")Exécutez ce code : rien n'apparaît dans le terminal — les deux lignes font partie de la condition, et la condition est fausse.
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")Certificate issuedLe second print est maintenant en dehors de la condition ; il s'exécute donc toujours — et un certificat vient d'être délivré à quelqu'un qui a échoué. Une seule ligne mal indentée casse la règle métier, et Python ne signale aucune erreur, car les deux versions sont du code valide.
Quatre espaces, pas de tabulations. Python accepte les deux, mais les mélanger dans un même fichier provoque une TabError, et c'est pénible à trouver, car tabulations et espaces ont exactement le même aspect à l'écran. Dans VS Code, que vous avez installé au chapitre 1, la touche Tab dans un fichier Python insère quatre espaces — c'est son réglage par défaut, et quatre espaces est la convention officielle de Python.else — l'autre chemin
age = 15
if age >= 18:
print("You may enter")
else:
print("Sorry, adults only")Sorry, adults onlyelse n'a pas de condition, parce que sa condition est déjà connue : « si rien de ce qui précède n'était vrai ». Exactement un des deux blocs, if ou else, s'exécute ; jamais les deux, jamais aucun.
elif — plusieurs chemins
marks = 72
if marks >= 80:
grade = "A"
elif marks >= 70:
grade = "B"
elif marks >= 60:
grade = "C"
elif marks >= 40:
grade = "D"
else:
grade = "F"
print(f"Marks {marks} gives grade {grade}")Marks 72 gives grade Belif signifie « sinon, si ». Voici ce qui se passe : Python parcourt la chaîne de haut en bas, exécute le bloc de la première condition trouvée vraie, puis quitte toute la chaîne. Il ne teste même pas les suivantes.
Avec marks = 72 : 72 >= 80 est faux, 72 >= 70 est vrai → grade = "B", c'est fini. 72 >= 60 et 72 >= 40 sont aussi vrais, mais ils ne sont jamais examinés.
Et voici le piège le plus important
Comme elif s'arrête à la première condition vraie, un mauvais ordre produit un programme qui tourne, ne signale aucune erreur et répond faux :
marks = 95
if marks >= 40:
grade = "Pass"
elif marks >= 80:
grade = "Excellent"
else:
grade = "Fail"
print(grade)Pass95 points, et pas de Excellent. Parce que 95 >= 40 était vrai immédiatement, et Python s'est arrêté là — la deuxième condition n'a jamais été testée.
La règle à retenir : placez la condition la plus stricte et la plus précise en premier, et la plus large en dernier. Pour des tranches de valeurs numériques, descendez depuis la plus grande, comme dans l'exemple des notes ci-dessus.
Ce bug est si discret qu'on ne le repère qu'en exécutant le code. Prenez donc l'habitude suivante : après avoir écrit une chaîne de conditions, exécutez-la une fois avec une valeur pour chaque branche. Le code des notes ci-dessus devrait donner cinq réponses différentes pour 95, 72, 65, 45 et 20. Si deux réponses sont identiques, l'ordre est faux.
Une condition dans une condition
is_logged_in = True
is_admin = False
if is_logged_in:
if is_admin:
print("Welcome, admin")
else:
print("Welcome, user")
else:
print("Please log in")Welcome, userLe if intérieur est indenté de quatre espaces, car il se trouve sous le if extérieur, et ses propres lignes print sont indentées de huit. Cela fonctionne, mais plus il y a de niveaux, plus le code est difficile à lire. Souvent, and dit la même chose plus clairement :
is_logged_in = True
is_admin = False
if is_logged_in and is_admin:
print("Welcome, admin")
elif is_logged_in:
print("Welcome, user")
else:
print("Please log in")Welcome, userLe meilleur choix dépend de la version qui se lit le plus facilement. Quand vous vous retrouvez à plus de trois niveaux de profondeur, arrêtez-vous et repensez le code — c'est presque toujours le signe que les conditions peuvent être organisées autrement.
Valider une saisie
Nous disposons maintenant de l'outil qui résout le problème laissé ouvert dans un chapitre précédent : que faire quand quelqu'un ne tape rien, ou tape un mot ?
raw = input("Your age: ").strip()
if raw == "":
print("You did not type anything")
elif raw.isdigit():
age = int(raw)
if age >= 18:
print(f"Age {age}: you may enter")
else:
print(f"Age {age}: adults only")
else:
print(f"'{raw}' is not a whole number")Your age: twenty
'twenty' is not a whole numberisdigit() est une nouvelle méthode : elle indique si chaque caractère du texte est un chiffre. C'est la façon simple de vérifier avant de passer quoi que ce soit à int(), et elle fait disparaître la ValueError. (isdigit() n'accepte ni les nombres négatifs ni les décimaux — pour cela, il faut try, que nous verrons plus tard.)
Un exemple complet
fare.py :
# Work out a ticket fare from age and day of week
age = int(input("Passenger age : "))
day = input("Day of week : ").strip().lower()
base_fare = 120.0
# Most specific rule first, loosest last
if age < 5:
fare = 0.0
category = "Infant"
elif age < 18:
fare = base_fare * 0.5
category = "Child"
elif age >= 60:
fare = base_fare * 0.7
category = "Senior"
else:
fare = base_fare
category = "Adult"
is_weekend = day == "saturday" or day == "sunday"
if is_weekend:
fare = fare * 1.2
print()
print(f"Category : {category}")
print(f"Weekend : {is_weekend}")
print(f"Fare : {fare:.2f}")Passenger age : 65
Day of week : Sunday
Category : Senior
Weekend : True
Fare : 100.80Remarquez deux choix de conception. D'abord, les conditions sur l'âge sont enchaînées avec elif, car un passager tombe dans une seule catégorie. Ensuite, la condition sur le week-end est un if séparé, car c'est une question indépendante : quel que soit l'âge, le supplément du week-end s'applique en plus. Décider ce qui doit être un elif et ce qui doit être un if séparé, c'est le vrai travail d'écriture des conditions.
En cas de problème
SyntaxError: expected ':' Le deux-points à la fin de la ligne if, elif ou else est manquant.
IndentationError: expected an indented block after 'if' statement La ligne qui suit le if n'est pas indentée. Une condition doit contenir au moins une ligne à l'intérieur.
IndentationError: unexpected indent Une ligne est indentée sans raison. Déterminez à quel bloc cette ligne est censée appartenir.
TabError: inconsistent use of tabs and spaces in indentation Des tabulations et des espaces sont mélangés dans un même fichier. Utilisez « convertir l'indentation en espaces » dans votre éditeur.
SyntaxError — un elif ou un else seul elif et else appartiennent toujours à un if, et doivent être indentés au même niveau que ce if.
TypeError: '>=' not supported between instances of 'str' and 'int' Vous avez oublié de convertir la valeur de input(). Écrivez int(input(...)).
Les conditions semblent correctes, mais le programme prend le mauvais chemin Vérifiez l'ordre. Si une condition large vient en premier, la condition stricte n'est jamais testée. Exécutez le code une fois avec une valeur pour chaque branche.
Étape 4 sur 6 — Prédire
Vérifiez votre compréhension
Avec 85 points, qu'affiche ce programme ?
marks = 85
if marks >= 40:
print("Pass")
elif marks >= 80:
print("Excellent")
else:
print("Fail")- AExcellent Pass
- BPass
- CPass Excellent
- DExcellent
Qu'affiche ce programme ?
score = 30
if score >= 50:
print("Passed")
print("Done")- APassed Done
- BDone
- CRien du tout
- DPassed
Même quand la personne tape 25, le programme s'arrête avec une TypeError. Quelle en est la cause, et quelle est la correction ?
age = input("Age: ")
if age >= 18:
print("Adult")
else:
print("Minor")- A`input()` renvoie du texte, et un texte ne peut pas être comparé à un nombre — il faut `age = int(input("Age: "))`
- BUn `elif` est obligatoire avant un `else`
- C`>=` ne peut pas être utilisé dans une condition `if` ; il faut `>`
- D`age` est un mot réservé, donc la comparaison a échoué
Répondre nécessite un compte
Connectez-vous pour vérifier vos réponses
Les questions sont ci-dessus, et les résoudre de tête est ce qui compte vraiment. Connectez-vous pour voir les réponses, les explications et les indices à trois niveaux.
À vous de jouer
Écrivez un fichier appelé bmi.py qui reçoit une taille en mètres et un poids en kilogrammes, calcule l'IMC et indique la catégorie.
La formule : bmi = weight / (height * height)
Les catégories :
- Moins de 18,5 — Underweight
- 18,5 ou plus, mais moins de 25 — Normal
- 25 ou plus, mais moins de 30 — Overweight
- 30 ou plus — Obese
Les bornes sont écrites avec « moins de » (<) et « ou plus » (>=) à dessein. Écrire « de 18,5 à 24,9 » laisserait un trou au milieu : un IMC de 24,95 ne tomberait alors dans aucune catégorie. Avec < et >=, chaque nombre tombe dans une seule catégorie et une seule.
Quatre conditions :
- Afficher l'IMC avec une décimale
- Ordonner les conditions pour que les quatre catégories fonctionnent réellement
- Si la taille vaut
0, s'arrêter avant la division et afficher un message — sinon vous obtenez uneZeroDivisionError - Exécutez-le avec quatre valeurs couvrant les quatre catégories, ainsi qu'avec des valeurs situées exactement aux bornes — dans quelle catégorie tombe un IMC exactement égal à 25 ? (Ce doit être Overweight.)
La quatrième condition est la plus importante. Les valeurs situées pile sur une borne sont précisément l'endroit où apparaissent les erreurs d'ordre des conditions.
Cette mission va plus loin
Ce que vous avez lu ci-dessus est la mission complète — rien n’en a été retiré. Pro ajoute :
- Ce qui se passe vraiment en coulisses : comment Python exécute ce code
- La solution complète de l’exercice, expliquée étape par étape
- Des exercices supplémentaires plus difficiles
- La question d’entretien sur ce sujet, avec une réponse modèle
Étape 6 sur 6
Défi — le quiz du chapitre
Dix questions, de la plus facile à la plus difficile. Les dernières sont difficiles exprès.
Connectez-vous pour faire le quiz