12  Conditions : if, elif, else

Après les types et les opérateurs, il est temps de faire réagir nos programmes. Les conditions permettent à Python de choisir quoi exécuter selon la valeur des données. C’est le premier vrai pas vers des programmes intelligents.

12.1 Pourquoi des conditions ?

Un programme sans condition fait toujours la même chose, quelle que soit la situation. Les conditions permettent de brancher différemment selon les valeurs.

Exemple concret : déterminer si un apprenant a validé un examen.

note = 14
if note >= 10:
    print("Admis")
else:
    print("Recalé")
Admis

En français : « si la note est supérieure ou égale à 10, alors afficher ‘Admis’, sinon afficher ‘Recalé’ ».

12.2 Les opérateurs de comparaison (rappel)

Déjà vus au chapitre 2, ces opérateurs renvoient toujours un booléen (True ou False) :

Opérateur Signification
== Égal à
!= Différent de
< Strictement inférieur
> Strictement supérieur
<= Inférieur ou égal
>= Supérieur ou égal

12.3 La structure if

La forme la plus simple : exécuter un bloc seulement si une condition est vraie.

temperature = 35
if temperature > 30:
    print("Il fait chaud !")
    print("Pensez à bien vous hydrater.")
Il fait chaud !
Pensez à bien vous hydrater.

Anatomie d’un if

if <condition>:       ← deux-points obligatoires en fin de ligne
    <instruction 1>   ← indentation obligatoire (4 espaces)
    <instruction 2>
<suite du programme>  ← pas d'indentation : hors du if

Trois points critiques pour le TOSA :

  1. Les deux-points : en fin de ligne du if — obligatoires.
  2. L’indentation du bloc — obligatoire et cohérente (4 espaces par convention).
  3. Quand l’indentation s’arrête, c’est la fin du bloc if.
⚠️ L’indentation fait partie de la syntaxe

Contrairement à d’autres langages qui utilisent des accolades {}, Python structure les blocs par indentation.

Oublier l’indentation :

if True:
print("oups")
  Cell In[3], line 2
    print("oups")
    ^
IndentationError: expected an indented block after 'if' statement on line 1

Mélanger tabulation et espaces dans un même bloc produit aussi des erreurs. Utilisez toujours 4 espaces (votre éditeur le fait automatiquement la plupart du temps).

12.4 La structure if / else

On ajoute un bloc alternatif qui s’exécute si la condition est fausse.

age = 17
if age >= 18:
    print("Vous êtes majeur")
else:
    print("Vous êtes mineur")
Vous êtes mineur

Le else n’a pas de condition — c’est le « tout le reste des cas ».

12.5 La structure if / elif / else

Pour enchaîner plusieurs conditions qui s’excluent mutuellement, on utilise elif (contraction de else if).

note = 14

if note >= 16:
    mention = "Très bien"
elif note >= 14:
    mention = "Bien"
elif note >= 12:
    mention = "Assez bien"
elif note >= 10:
    mention = "Passable"
else:
    mention = "Insuffisant"

print("Mention :", mention)
Mention : Bien

Règles de l’exécution

Python évalue les conditions une à une, du haut vers le bas, et exécute le premier bloc dont la condition est vraie. Les suivants sont ignorés.

Dans l’exemple ci-dessus, avec note = 14 : 1. note >= 16False, on passe au suivant 2. note >= 14True → on exécute ce bloc et on sort de la structure 3. Les elif et else suivants ne sont pas évalués

L’ordre des conditions compte

Les conditions étant testées dans l’ordre, il faut aller du plus strict au plus large. Sinon, on peut tomber sur des erreurs logiques :

# ❌ Mauvais ordre : "note >= 10" capture TOUT et bloque les autres
note = 16
if note >= 10:
    mention = "Passable"     # ← s'exécute même pour 16 !
elif note >= 14:
    mention = "Bien"
elif note >= 16:
    mention = "Très bien"
print(mention)   # → Passable (pas Très bien !)
Passable
# ✅ Bon ordre : du plus strict au plus large
note = 16
if note >= 16:
    mention = "Très bien"
elif note >= 14:
    mention = "Bien"
elif note >= 10:
    mention = "Passable"
print(mention)
Très bien

if / else / elif : que choisir ?

Cas Structure
Exécuter du code seulement dans un cas if seul
Deux cas mutuellement exclusifs if / else
Plus de deux cas mutuellement exclusifs if / elif / else

12.6 Combiner plusieurs conditions : and, or, not

Déjà vus au chapitre 2, ils sont omniprésents dans les conditions.

age = 25
permis = True

if age >= 18 and permis:
    print("Peut conduire")
else:
    print("Ne peut pas conduire")
Peut conduire
jour = "dimanche"
ferie = False

if jour == "dimanche" or ferie:
    print("Pas de travail aujourd'hui")
else:
    print("Journée de travail")
Pas de travail aujourd'hui
connecte = False
if not connecte:
    print("Veuillez vous connecter")
Veuillez vous connecter

Court-circuit — rappel

Python évalue and et or en court-circuit. Cela permet notamment d’éviter des erreurs :

# Éviter une division par zéro
diviseur = 0
if diviseur != 0 and 10 / diviseur > 1:
    print("OK")
else:
    print("Impossible (diviseur = 0 ou quotient trop petit)")
Impossible (diviseur = 0 ou quotient trop petit)

Si on avait inversé les deux conditions, on aurait eu une ZeroDivisionError.

12.7 Conditions imbriquées

On peut mettre un if à l’intérieur d’un autre if. L’indentation devient alors plus profonde.

age = 25
permis = True
a_voiture = True

if age >= 18:
    if permis:
        if a_voiture:
            print("Peut conduire sa voiture")
        else:
            print("Peut conduire, mais n'a pas de voiture")
    else:
        print("Majeur mais pas de permis")
else:
    print("Trop jeune")
Peut conduire sa voiture
Éviter les imbrications profondes

Les conditions trop imbriquées deviennent vite illisibles. Préférez souvent des conditions combinées :

age = 25
permis = True
a_voiture = True

# ✅ Plus lisible avec and
if age >= 18 and permis and a_voiture:
    print("Peut conduire sa voiture")
elif age >= 18 and permis:
    print("Peut conduire, mais n'a pas de voiture")
elif age >= 18:
    print("Majeur mais pas de permis")
else:
    print("Trop jeune")
Peut conduire sa voiture

12.8 Cas particuliers : la « véracité implicite »

En Python, on peut tester directement une valeur sans la comparer explicitement. Python la convertit en booléen selon les règles vues au chapitre 1.

nom = ""
if nom:
    print("Bonjour", nom)
else:
    print("Vous n'avez pas entré de nom")
Vous n'avez pas entré de nom

Ici, if nom: équivaut à if nom != "":. Quand nom est vide, il est considéré comme False.

Rappel des valeurs falsy (considérées comme fausses) :

  • Nombres nuls : 0, 0.0
  • Chaîne vide : ""
  • Listes/tuples/dicts/sets vides : [], (), {}
  • None

Tout le reste est truthy (vrai).

liste = []
if liste:
    print("Il y a des éléments :", liste)
else:
    print("La liste est vide")
La liste est vide
⚠️ Piège TOSA : comparer à zéro ou à vide

Ces deux expressions sont équivalentes mais la seconde est plus idiomatique :

# Version verbeuse
if len(ma_liste) > 0:
    ...

# Version pythonique (recommandée)
if ma_liste:
    ...

Au TOSA, les deux formes apparaissent — sachez les reconnaître.

12.9 L’expression ternaire (bonus utile)

Quand on veut juste choisir entre deux valeurs selon une condition, on peut condenser un if/else sur une seule ligne.

Syntaxe : valeur_si_vrai if condition else valeur_si_faux

age = 17
statut = "majeur" if age >= 18 else "mineur"
print(statut)
mineur

Équivalent à :

if age >= 18:
    statut = "majeur"
else:
    statut = "mineur"

L’expression ternaire est utile pour les affectations simples — à ne pas abuser pour ne pas nuire à la lisibilité.


🧩 Quiz 2.1 — Conditions

Question 1

Que s’affiche-t-il ?

x = 10
if x > 5:
    print("A")
elif x > 8:
    print("B")
else:
    print("C")
  1. A
  2. B
  3. A puis B
  4. C

a) A — la première condition vraie arrête le processus. x > 5 étant vraie, le bloc est exécuté et les elif/else sont ignorés.

x = 10
if x > 5:
    print("A")
elif x > 8:
    print("B")
else:
    print("C")
A

Question 2

Que s’affiche-t-il ?

x = 0
if x:
    print("vrai")
else:
    print("faux")
  1. vrai
  2. faux
  3. 0
  4. Une erreur

b) faux — la valeur 0 est considérée comme falsy en Python. La condition if x: équivaut ici à if False:.

x = 0
if x:
    print("vrai")
else:
    print("faux")
faux

Question 3

Quelle est l’erreur dans ce code ?

x = 5
if x > 0
    print("positif")
  1. Il manque des parenthèses autour de x > 0
  2. Il manque else:
  3. Il manque les deux-points : après x > 0
  4. Il manque then

c) Il manque les deux-points : après x > 0. C’est une erreur de syntaxe extrêmement fréquente en début d’apprentissage.

#| error: true
x = 5
if x > 0
    print("positif")

Question 4

Que renvoie ce code ?

age = 25
if age >= 18 and age < 30:
    print("Jeune adulte")
elif age >= 30:
    print("Adulte")
else:
    print("Mineur")
  1. Jeune adulte
  2. Adulte
  3. Mineur
  4. Une erreur

a) Jeune adulte — la première condition age >= 18 and age < 30 est vraie pour 25.

age = 25
if age >= 18 and age < 30:
    print("Jeune adulte")
elif age >= 30:
    print("Adulte")
else:
    print("Mineur")
Jeune adulte

Variante plus pythonique avec comparaison chaînée : if 18 <= age < 30:.

Question 5

Que vaut resultat après exécution ?

x = 7
resultat = "pair" if x % 2 == 0 else "impair"
  1. "pair"
  2. "impair"
  3. True
  4. False

b) "impair"7 % 2 == 1, donc la condition est fausse, on prend la valeur après else.

x = 7
resultat = "pair" if x % 2 == 0 else "impair"
print(resultat)
impair

Question 6

Quelle affirmation est VRAIE ?

  1. elif peut apparaître sans if avant.
  2. Un if doit obligatoirement avoir un else.
  3. Il peut y avoir plusieurs elif dans une même structure.
  4. Il peut y avoir plusieurs else dans une même structure.

c) Il peut y avoir plusieurs elif — on peut en chaîner autant qu’on veut. En revanche, else est unique et vient toujours en dernier, et un elif suppose un if avant lui.

Question 7

Que s’affiche-t-il ?

nom = "   "
if nom:
    print("Bonjour")
else:
    print("Nom manquant")
  1. Bonjour
  2. Nom manquant
  3. Rien
  4. Une erreur

a) Bonjour — attention : une chaîne contenant des espaces n’est pas vide ! bool(" ") vaut True. Seule la chaîne strictement vide "" est falsy.

print(bool(""))       # False
print(bool("   "))    # True (ce n'est pas vide !)
False
True

Pour tester qu’une chaîne contient quelque chose de non-blanc, utilisez .strip() :

nom = "   "
if nom.strip():
    print("Bonjour")
else:
    print("Nom manquant (ou que des espaces)")
Nom manquant (ou que des espaces)

✏️ Exercice 4.1 — Catégorie d’âge

Écrivez un programme qui classe un âge dans les catégories suivantes :

  • Moins de 3 ans : bébé
  • De 3 à 11 ans : enfant
  • De 12 à 17 ans : adolescent
  • De 18 à 64 ans : adulte
  • 65 ans et plus : senior
age = int(input("Votre âge : "))

# Votre code avec if/elif/else
def categorie(age):
    if age < 3:
        return "bébé"
    elif age < 12:
        return "enfant"
    elif age < 18:
        return "adolescent"
    elif age < 65:
        return "adulte"
    else:
        return "senior"

# Tests
for age in [1, 8, 15, 30, 70]:
    print(f"{age} ans → {categorie(age)}")
1 ans → bébé
8 ans → enfant
15 ans → adolescent
30 ans → adulte
70 ans → senior
  • On écrit age < 3 puis age < 12 (pas age >= 3 and age < 12). Si on arrive au second elif, c’est que age < 3 était faux, donc age >= 3 implicite.
  • L’ordre du plus petit au plus grand fonctionne. L’ordre inverse aussi, mais il faut adapter les comparaisons :
def categorie(age):
    if age >= 65:
        return "senior"
    elif age >= 18:
        return "adulte"
    elif age >= 12:
        return "adolescent"
    elif age >= 3:
        return "enfant"
    else:
        return "bébé"

print(categorie(30))
adulte

✏️ Exercice 4.2 — Validation de mot de passe

Écrivez un programme qui vérifie qu’un mot de passe remplit les critères suivants :

  1. Longueur minimale : 8 caractères.
  2. Contient au moins un chiffre.
  3. Contient au moins une lettre majuscule.

Affichez la liste des critères non remplis, ou "Mot de passe OK" si tout est bon.

mdp = input("Entrez un mot de passe : ")

# Tester les 3 critères et afficher les manquants
def valider_mdp(mdp):
    erreurs = []

    if len(mdp) < 8:
        erreurs.append("moins de 8 caractères")

    # any() renvoie True si au moins un élément est True
    if not any(c.isdigit() for c in mdp):
        erreurs.append("pas de chiffre")

    if not any(c.isupper() for c in mdp):
        erreurs.append("pas de majuscule")

    if not erreurs:
        print("Mot de passe OK ✅")
    else:
        print("Mot de passe invalide :", ", ".join(erreurs))

# Tests
for mdp in ["abc", "abcdefgh", "Abcdefgh", "Abcdef12"]:
    print(f"'{mdp}' →", end=" ")
    valider_mdp(mdp)
'abc' → Mot de passe invalide : moins de 8 caractères, pas de chiffre, pas de majuscule
'abcdefgh' → Mot de passe invalide : pas de chiffre, pas de majuscule
'Abcdefgh' → Mot de passe invalide : pas de chiffre
'Abcdef12' → Mot de passe OK ✅
  • any(c.isdigit() for c in mdp) retourne True dès qu’un caractère est un chiffre.
  • Cette syntaxe (expression génératrice) sera vue en détail en Partie 3.
  • Version simple sans any, avec une boucle explicite :
def contient_chiffre(mdp):
    for c in mdp:
        if c.isdigit():
            return True
    return False

print(contient_chiffre("abc123"))
print(contient_chiffre("abcdef"))
True
False

✏️ Exercice 4.3 — Prix avec remise progressive

Un magasin applique des remises selon le montant d’achat :

  • Moins de 50 € : aucune remise.
  • De 50 à 99 € : 5 % de remise.
  • De 100 à 199 € : 10 % de remise.
  • 200 € et plus : 15 % de remise.

Écrivez un programme qui demande un montant et affiche le prix final après remise.

montant = float(input("Montant de l'achat : "))

# Calculer la remise et le prix final
def prix_final(montant):
    if montant >= 200:
        remise = 0.15
    elif montant >= 100:
        remise = 0.10
    elif montant >= 50:
        remise = 0.05
    else:
        remise = 0

    reduction = montant * remise
    final = montant - reduction

    return remise, reduction, final

# Tests
for m in [30, 75, 150, 250]:
    taux, red, fin = prix_final(m)
    print(f"{m:>6.2f} € → remise {taux*100:>3.0f}%  = {red:>6.2f} €  → {fin:.2f} €")
 30.00 € → remise   0%  =   0.00 €  → 30.00 €
 75.00 € → remise   5%  =   3.75 €  → 71.25 €
150.00 € → remise  10%  =  15.00 €  → 135.00 €
250.00 € → remise  15%  =  37.50 €  → 212.50 €

Le formatage avec :>6.2f sera vu avec les f-strings en Partie 2.

Plus Pythonique, on stocke les seuils dans une liste de tuples (vu au chapitre 6) :

def prix_final_v2(montant):
    bareme = [
        (200, 0.15),
        (100, 0.10),
        (50, 0.05),
    ]
    for seuil, taux in bareme:
        if montant >= seuil:
            return montant * (1 - taux)
    return montant

for m in [30, 75, 150, 250]:
    print(f"{m} € → {prix_final_v2(m):.2f} €")
30 € → 30.00 €
75 € → 71.25 €
150 € → 135.00 €
250 € → 212.50 €

À retenir

Points clés du chapitre
  1. if, elif, else → choisir entre plusieurs branches. Un seul bloc s’exécute (celui de la première condition vraie).
  2. Les deux-points : en fin de if/elif/else sont obligatoires.
  3. L’indentation (4 espaces) définit le bloc — c’est la syntaxe de Python.
  4. L’ordre des conditions compte : allez du plus strict au plus large.
  5. and, or, not pour combiner. Court-circuit utile pour éviter des erreurs.
  6. if x: teste la véracité implicite0, "", [], None… sont falsy.
  7. Expression ternaire : a if cond else b — utile pour les affectations simples.

← Chapitre précédent : Les chaînesChapitre suivant : Les listes →