Les conditionnelles
Pourquoi ? Décider.
Jusqu'ici, nos programmes exécutent les instructions les unes après les autres, toujours dans le même ordre. Mais un programme doit souvent choisir ce qu'il fait selon la situation : afficher « majeur » ou « mineur » selon l'âge, accepter ou refuser un mot de passe, calculer un tarif selon le client.
Une conditionnelle donne au programme ce pouvoir de décision. On la représente souvent par un diagramme d'activité : les losanges sont les questions que l'on se pose, les rectangles les actions à réaliser.
flowchart TD
A((Début)) --> B["Lire age et promo (o/n)"]
B --> C{"age < 0 ?"}
C -- Vrai --> X["Afficher: Age invalide"] --> Z(("Fin"))
C -- Faux --> D{"age < 12 ?"}
D -- Vrai --> T1["tarif = 5"] --> F{"Promo ?"}
D -- Faux --> E{"age < 18 ?"}
E -- Vrai --> T2["tarif = 7"] --> F
E -- Faux --> G{"age >= 65 ?"}
G -- Vrai --> T3["tarif = 6"] --> F
G -- Faux --> T4["tarif = 10"] --> F
F -- Vrai --> R1["tarif = max(0, tarif - 2)"] --> O["Afficher tarif"]
F -- Faux --> R2["tarif inchangé"] --> O
O --> Z
(Combien auriez-vous payé dans ce cinéma ? Vous coderez ce diagramme en exercice.)
SI ... ALORS : une seule branche
Conditionnelle à une branche
SI (il fait beau) ALORS (je mets mes lunettes de soleil).
« Il fait beau » est la condition. « Je mets mes lunettes » est le bloc d'instructions exécuté seulement si la condition est vraie.
En Python :
Le bloc d'instructions doit être indenté (touche tabulation).
Ce que fait la machine, pas à pas
Avec age valant 20 :
- Python évalue la condition
age >= 18, soit20 >= 18: cela vautTrue. - La condition est vraie : Python entre dans le bloc indenté et exécute ses deux lignes.
- Puis il continue avec la ligne non indentée « Fin du programme. »
Si age valait 15, la condition 15 >= 18 vaudrait False : Python sauterait tout le bloc indenté.
L'indentation définit le bloc
Ce sont les espaces en début de ligne qui disent ce qui est « à l'intérieur » du if. Une ligne réalignée à gauche n'en fait plus partie.
SI ... ALORS ... SINON : deux branches
Conditionnelle à deux branches
SI (il fait beau) ALORS (je mets mes lunettes) SINON (je prends mon parapluie).
age = int(input("Votre âge ? "))
if age >= 18:
print("Vous êtes majeur !")
else:
print("Vous êtes mineur !")
print("Au revoir !")
Exactement un des deux blocs s'exécute, jamais les deux, jamais aucun.
Les opérateurs de comparaison
Une condition se construit avec des comparaisons :
| Opérateur | Signification |
|---|---|
== |
égal à |
!= |
différent de |
< |
strictement inférieur à |
> |
strictement supérieur à |
<= |
inférieur ou égal à |
>= |
supérieur ou égal à |
Piège : == n'est pas =
=est l'affectation :age = 18range 18 dansage.==est le test d'égalité :age == 18vautTrueouFalse.
Dans une condition, on teste, donc on écrit ==. C'est une source de bugs très fréquente chez les débutants.
Exercices (deux branches)
- Parc. Il faut mesurer au moins 1m30 pour entrer. Demandez la taille en cm et indiquez si l'accès est autorisé.
- Plus grand. Demandez deux nombres et affichez le plus grand.
- Valeur absolue. Demandez un nombre et affichez sa valeur absolue (sans
abs). - Mot de passe. Le mot de passe est
"azerty". Demandez-le et indiquez si l'accès est autorisé.
Une condition est un booléen
Une comparaison comme 7 > 4 est une opération, au même titre que + ou *, sauf qu'elle ne renvoie pas un nombre mais un booléen : True ou False (le type booléen est présenté dans Les booléens, du nom du logicien George Boole).
Une condition est un calcul
Une condition est en réalité un calcul qui renvoie un booléen. Quand vous vous demandez s'il fait beau, votre cerveau calcule vrai ou faux à partir de ce que voient vos yeux.
On peut donc stocker une condition dans une variable, puis l'utiliser :
Écrire if majeur, pas if majeur == True
Si majeur vaut True, alors majeur == True vaut aussi True ; s'il vaut False, majeur == True vaut False. Tester majeur ou majeur == True revient donc au même. On écrit simplement :
Exercice : type et valeur
On exécute ces lignes dans l'ordre. Donnez le type et la valeur de chaque variable.
Réponse
a : int, 18. b : bool, True. c : bool, False. e : bool, True. Puis a devient float, 6.0. f : bool, True (car 6.0 == 6).
SINON SI : plusieurs branches (elif)
Pour plus de deux cas, on enchaîne avec elif (contraction de « else if »).
Le mécanisme caché : Python s'arrête au premier vrai
Python teste les conditions dans l'ordre. Dès qu'une est vraie, il exécute son bloc et ignore toutes les suivantes. Évaluer la condition d'un elif signifie donc que toutes les précédentes étaient fausses. Le else final ne sert que si aucune n'a été vraie.
L'ordre des elif compte
Avec note = 15 :
if note >= 10:
mention = "passable"
elif note >= 12:
mention = "assez bien"
elif note >= 14:
mention = "bien"
"passable" ! Car 15 >= 10 est vrai en premier, et Python s'arrête là. Il faut tester du cas le plus exigeant au moins exigeant.
Exercices (elif)
- Mention au bac. À partir d'une moyenne sur 20 :
[0;8)Recalé,[8;10)Rattrapage,[10;12)Sans mention,[12;14)Assez bien,[14;16)Bien,[16;18)Très bien,[18;20]Félicitations. - Année bissextile. Une année est bissextile si elle est multiple de 4 mais pas de 100, ou multiple de 400. Testez 2021, 2020, 1900, 2000.
Corrigé (mention)
Combiner les conditions : and, or, not
On combine des booléens avec and (et), or (ou, inclusif) et not (non). Les tables de vérité sont dans Les booléens. Ce sont de vraies opérations : elles prennent des booléens et renvoient un booléen.
Cela permet souvent de remplacer des conditions imbriquées par une seule, plus claire.
Le pass sanitaire : de l'imbriqué au booléen
On peut entrer si on est vacciné, ou, à défaut, si on a un test négatif.
Version imbriquée, lourde :
if vaccine:
print("Vous pouvez entrer")
else:
if test_negatif:
print("Vous pouvez entrer")
else:
print("Vous ne pouvez pas entrer")
Version elif, un peu mieux :
if vaccine:
print("Vous pouvez entrer")
elif test_negatif:
print("Vous pouvez entrer")
else:
print("Vous ne pouvez pas entrer")
Version booléenne, la plus claire :
Tester un encadrement
Pour vérifier qu'un nombre n est entre 4 et 8 inclus, il faut qu'il soit >= 4 et <= 8 :
Exercices (booléens)
- Triangle. Demandez trois longueurs entières
a,b,c. Si elles ne peuvent pas former un triangle (un côté doit être inférieur à la somme des deux autres), affichezpas un triangle. Sinon, affichezequilateral,isoceleouscalene. - Cinéma. Implémentez en Python le calcul de tarif du diagramme d'activité du début de la page.
- Bissextile, version booléenne. Reprenez l'année bissextile avec un seul calcul booléen.
Projet : livre dont vous êtes le héros
Implémentez l'histoire suivante avec des conditionnelles et des saisies utilisateur.
flowchart TD
A((Début)) --> C{Choisir la forêt ?}
C -- Vrai --> D[Cabane forêt]
D --> E{Frapper ?}
E -- Vrai --> K1[cle = True] --> H[Arrive à la grille]
E -- Faux --> L1[Échec : piège] --> Z(((Fin)))
H --> G{cle ?}
G -- Vrai --> V1[Victoire] --> Z
G -- Faux --> L2[Échec : grille fermée] --> Z
C -- Faux --> M[Entrée caverne]
M --> N{Torche ?}
N -- Vrai --> P[Avancer]
P --> Q{Courir ?}
Q -- Vrai --> V2[Victoire] --> Z
Q -- Faux --> L3[Échec : perdu] --> Z
N -- Faux --> L4[Échec : trou] --> Z
Une conditionnelle combinée à une boucle permet de filtrer ou de compter (par exemple : compter les 6 sur 1000 lancers de dé). On y viendra juste après, avec Les boucles.