Aller au contenu

Semaine 3 - Les flux conditionnels — if, else, elif

Jusqu’à maintenant, tous tes programmes suivaient un chemin unique : les instructions s’exécutent une après l’autre, de haut en bas, sans jamais dévier. C’est ce qu’on appelle un flux séquentiel.

poids = float(input("Poids (kg) : "))
taille = float(input("Taille (m) : "))
imc = poids / taille ** 2
print("Ton IMC est :", format(imc, ".2f"))

On peut visualiser ce programme comme un flux linéaire :

flowchart TD
    A["Lire le poids"] --> B["Lire la taille"]
    B --> C["Calculer l'IMC"]
    C --> D["Afficher le résultat"]

Chaque boîte représente une instruction, et les flèches montrent l’ordre d’exécution. Le programme entre par le haut et sort par le bas, sans surprise.


Dans la réalité, les problèmes demandent souvent de prendre des décisions. Considère ces situations :

Un site web affiche « Bonjour » le matin et « Bonsoir » le soir.

Un parc d’attractions n’admet que les visiteurs mesurant au moins 1,20 m sur certains manèges.

Une facture applique un rabais de 10 % si le client est membre.

Dans chacun de ces cas, le programme ne peut pas simplement dérouler les mêmes instructions à chaque fois. Il doit examiner une condition puis choisir un chemin parmi plusieurs possibles.

C’est exactement ce que fait une bifurcation dans le flux :

flowchart TD
    A["Lire la taille"] --> B{"taille >= 1.20 ?"}
    B -- Oui --> C["Accès autorisé"]
    B -- Non --> D["Accès refusé"]
    C --> E["Suite du programme"]
    D --> E

Le losange représente une question (une condition). Selon la réponse, le flux emprunte un chemin ou l’autre. Mais les deux chemins se rejoignent ensuite : le programme continue normalement après la bifurcation.


Pour que Python puisse prendre une décision, il a besoin d’une condition — une expression qui vaut soit True (vrai), soit False (faux). Ces deux valeurs forment le type booléen (bool).

>>> 5 > 3
True
>>> 2 == 7
False
>>> type(True)
<class 'bool'>

Les opérateurs de comparaison permettent de comparer deux valeurs. Le résultat est toujours un booléen.

OpérateurSignificationExempleRésultat
==Égal à5 == 5True
!=Différent de5 != 3True
<Strictement inférieur à3 < 5True
>Strictement supérieur à5 > 5False
<=Inférieur ou égal à5 <= 5True
>=Supérieur ou égal à3 >= 5False

Tu peux tester ces expressions directement dans le shell IDLE :

>>> age = 22
>>> age >= 18
True
>>> age == 15
False
>>> temperature = -5
>>> temperature < 0
True

On peut aussi comparer des chaînes de caractères. Python compare alors l’ordre alphabétique (plus précisément, l’ordre des codes Unicode) :

>>> "alice" == "alice"
True
>>> "alice" == "Alice"
False
>>> "a" < "b"
True

Les opérateurs logiques permettent de combiner plusieurs conditions pour former des conditions plus complexes.

OpérateurSignificationExempleRésultat
andET — les deux conditions doivent être vraies5 > 3 and 2 < 4True
orOU — au moins une condition doit être vraie5 > 3 or 2 > 4True
notNON — inverse la conditionnot 5 > 3False

and retourne True seulement si les deux conditions sont vraies :

Condition ACondition BA and B
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse
>>> age = 25
>>> citoyen = "oui"
>>> age >= 18 and citoyen == "oui"
True
>>> age >= 18 and citoyen == "non"
False

or retourne True si au moins une des conditions est vraie :

Condition ACondition BA or B
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse
>>> jour = "samedi"
>>> jour == "samedi" or jour == "dimanche"
True
>>> jour == "lundi" or jour == "mardi"
False

not inverse simplement la valeur : True devient False et vice versa.

>>> est_pluie = False
>>> not est_pluie
True

On peut combiner and, or et not dans une même expression. L’ordre de priorité est : not d’abord, puis and, puis or. En cas de doute, utilise des parenthèses pour clarifier :

# Sans parenthèses : not, puis and, puis or
>>> True or False and not True
True
# Avec parenthèses : intention claire
>>> (True or False) and (not True)
False

Python offre une syntaxe spéciale pour vérifier qu’une valeur se trouve dans un intervalle :

# Les deux écritures sont équivalentes
>>> note = 75
>>> note >= 60 and note < 90
True
>>> 60 <= note < 90 # Comparaison chaînée — plus lisible
True

C’est une particularité de Python que peu d’autres langages offrent. Elle se lit naturellement comme en mathématiques : 60note<9060 \leq \text{note} < 90.


La forme la plus simple : on exécute un bloc de code seulement si une condition est vraie. Si elle est fausse, on ne fait rien de spécial.

age = int(input("Ton âge : "))
if age >= 18:
print("Tu es majeur(e).")
print("Merci, au revoir.")
flowchart TD
    A["Lire l'âge"] --> B{"age >= 18 ?"}
    B -- Oui --> C["Afficher 'Tu es majeur(e).'"]
    B -- Non --> D[" "]
    C --> E["Afficher 'Merci, au revoir.'"]
    D --> E
    style D fill:none,stroke:none

Avec age = 22 :

Tu es majeur(e).
Merci, au revoir.

Avec age = 15 :

Merci, au revoir.

Le print("Merci, au revoir.") s’exécute toujours, car il est en dehors du if (pas d’indentation).


if age >= 18:
print("Tu es majeur(e).")
  1. Le mot-clé if
  2. Une condition (une expression qui vaut True ou False)
  3. Les deux-points : à la fin de la ligne
  4. Le bloc indenté (décalé de 4 espaces) : les instructions à exécuter si la condition est vraie

Quand tu veux faire une chose ou une autre, utilise if-else :

temperature = float(input("Température (°C) : "))
if temperature >= 0:
print("Il ne gèle pas.")
else:
print("Attention, il gèle !")
print("Bonne journée.")
flowchart TD
    A["Lire la température"] --> B{"temp >= 0 ?"}
    B -- Oui --> C["'Il ne gèle pas.'"]
    B -- Non --> D["'Attention, il gèle !'"]
    C --> E["'Bonne journée.'"]
    D --> E

Le else n’a pas de condition : c’est le chemin emprunté quand la condition du if est fausse. On passe obligatoirement par un des deux chemins, jamais les deux.


Quand il y a plus de deux possibilités, on enchaîne les conditions avec elif (contraction de else if) :

note = float(input("Note (%) : "))
if note >= 90:
mention = "Excellent"
elif note >= 80:
mention = "Très bien"
elif note >= 70:
mention = "Bien"
elif note >= 60:
mention = "Passable"
else:
mention = "Échec"
print("Mention :", mention)
flowchart TD
    A["Lire la note"] --> B{"note >= 90 ?"}
    B -- Oui --> C["Excellent"]
    B -- Non --> D{"note >= 80 ?"}
    D -- Oui --> E["Très bien"]
    D -- Non --> F{"note >= 70 ?"}
    F -- Oui --> G["Bien"]
    F -- Non --> H{"note >= 60 ?"}
    H -- Oui --> I["Passable"]
    H -- Non --> J["Échec"]
    C --> K["Afficher la mention"]
    E --> K
    G --> K
    I --> K
    J --> K
ÉlémentQuantitéCondition ?Obligatoire ?
ifExactement 1OuiOui
elif0, 1, 2, … autant que nécessaireOuiNon
else0 ou 1NonNon

Le else est le filet de sécurité : il attrape tout ce qui n’a été capté par aucune condition précédente. Il est optionnel, mais souvent recommandé.


Le if imbriqué — une décision dans une décision

Section intitulée « Le if imbriqué — une décision dans une décision »

Parfois, une décision dépend d’une autre décision prise avant. On place alors un if à l’intérieur d’un autre if :

age = int(input("Ton âge : "))
if age >= 18:
permis = input("As-tu ton permis ? (oui/non) : ")
if permis == "oui":
print("Tu peux conduire.")
else:
print("Tu es majeur(e), mais tu n'as pas de permis.")
else:
print("Tu es trop jeune pour conduire.")
flowchart TD
    A["Lire l'âge"] --> B{"age >= 18 ?"}
    B -- Non --> C["'Trop jeune'"]
    B -- Oui --> D["Lire le permis"]
    D --> E{"permis == 'oui' ?"}
    E -- Oui --> F["'Tu peux conduire.'"]
    E -- Non --> G["'Majeur(e), mais pas de permis.'"]
    C --> H["Fin"]
    F --> H
    G --> H

Utilise elif quand les conditions sont mutuellement exclusives et portent sur le même sujet :

# Les conditions portent toutes sur la note
if note >= 90:
mention = "Excellent"
elif note >= 80:
mention = "Très bien"
elif note >= 60:
mention = "Passable"
else:
mention = "Échec"

Utilise un if imbriqué quand une condition dépend d’une autre ou porte sur un sujet différent :

# Le permis n'a de sens que si l'âge est suffisant
if age >= 18:
if permis == "oui":
print("Tu peux conduire.")

Dans cet exemple, les deux if sont indépendants. Ils seront donc tous les deux testés.

note = 95
if note >= 90:
print("Excellent") # ← s'exécute
if note >= 80:
print("Très bien") # ← s'exécute AUSSI !

Correction avec if-elif: dès qu’une condition est vraie, les suivantes sont ignorées

note = 95
if note >= 90:
print("Excellent") # ← s'exécute
elif note >= 80:
print("Très bien") # ← ignoré, car le if était déjà vrai

Le else se rattache toujours au dernier if ou elif du même niveau d’indentation. Dans cet exemple, le else se rattache au if le plus proche (le deuxième: if x > 100)

x = 5
if x > 0:
print("Positif")
if x > 100:
print("Grand nombre")
else:
print("Petit nombre") # ← s'exécute (x > 0 mais pas > 100)

Si tu voulais que le else se rattache au premier if, il faudrait changer l’indentation :

x = -3
if x > 0:
print("Positif")
if x > 100:
print("Grand nombre")
else:
print("Négatif ou nul") # ← rattaché au premier if

age = input("Ton âge : ") # age est un str !
if age >= 18: # ❌ compare un str avec un int
print("Majeur")

Ce code ne plante pas toujours, mais il ne fonctionne pas correctement. La chaîne "22" n’est pas le nombre 22. N’oublie jamais de convertir :

age = int(input("Ton âge : ")) # ✅ age est un int
if age >= 18:
print("Majeur")

Python interdit les blocs vides. Si tu veux « ne rien faire » dans un cas, utilise pass :

if note >= 60:
pass # On ne fait rien pour l'instant (à compléter plus tard)
else:
print("Échec")

Piège 5 : conditions toujours vraies ou toujours fausses

Section intitulée « Piège 5 : conditions toujours vraies ou toujours fausses »

Dans cet exemple, la condition (x > 5 or x < 20) est toujours vrai, qu’importe la valeur de x. Donc, le else ne sera jamais atteint.

x = 10
if x > 5 or x < 20: # Tout nombre est > 5 OU < 20
print("Toujours ici")
else:
print("Jamais ici") # Code mort !

L’erreur vient de la logique : il fallait probablement and au lieu de or :

# ✅ Teste si x est entre 5 et 20
if x > 5 and x < 20:
print("Entre 5 et 20")

StructureQuand l’utiliser
if seulTu veux faire quelque chose seulement si une condition est vraie, sinon rien
if-elseTu as exactement deux cas : vrai ou faux
if-elif-elseTu as plusieurs cas mutuellement exclusifs
if imbriquéUne décision dépend d’une décision précédente

Bonus : l’expression conditionnelle (opérateur ternaire)

Section intitulée « Bonus : l’expression conditionnelle (opérateur ternaire) »

Python permet d’écrire un if-else simple sur une seule ligne. C’est ce qu’on appelle une expression conditionnelle (ou opérateur ternaire) :

# Forme classique
if age >= 18:
statut = "majeur"
else:
statut = "mineur"
# Équivalent en une ligne
statut = "majeur" if age >= 18 else "mineur"

La syntaxe est :

valeur_si_vrai if condition else valeur_si_faux

Quelques exemples :

# Valeur absolue
resultat = nombre if nombre >= 0 else -nombre
# Parité
parite = "pair" if n % 2 == 0 else "impair"
# Maximum de deux nombres
maximum = a if a >= b else b
# Dans un print directement
print("Accès", "autorisé" if mot_de_passe == "abc123" else "refusé")