note = 14
if note >= 10:
print("Admis")
else:
print("Recalé")Admis
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.
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é’ ».
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 |
ifLa 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.
ifif <condition>: ← deux-points obligatoires en fin de ligne
<instruction 1> ← indentation obligatoire (4 espaces)
<instruction 2>
<suite du programme> ← pas d'indentation : hors du ifTrois points critiques pour le TOSA :
: en fin de ligne du if — obligatoires.if.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).
if / elseOn 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 ».
if / elif / elsePour 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
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 >= 16 → False, on passe au suivant 2. note >= 14 → True → on exécute ce bloc et on sort de la structure 3. Les elif et else suivants ne sont pas évalués
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 |
and, or, notDé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
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.
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
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
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) :
0, 0.0""[], (), {}NoneTout 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
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.
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é.
Que s’affiche-t-il ?
x = 10
if x > 5:
print("A")
elif x > 8:
print("B")
else:
print("C")ABA puis BCa) 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
Que s’affiche-t-il ?
x = 0
if x:
print("vrai")
else:
print("faux")vraifaux0b) 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
Quelle est l’erreur dans ce code ?
x = 5
if x > 0
print("positif")x > 0else:: après x > 0thenc) 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")Que renvoie ce code ?
age = 25
if age >= 18 and age < 30:
print("Jeune adulte")
elif age >= 30:
print("Adulte")
else:
print("Mineur")Jeune adulteAdulteMineura) 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:.
Que vaut resultat après exécution ?
x = 7
resultat = "pair" if x % 2 == 0 else "impair""pair""impair"TrueFalseb) "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
Quelle affirmation est VRAIE ?
elif peut apparaître sans if avant.if doit obligatoirement avoir un else.elif dans une même structure.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.
Que s’affiche-t-il ?
nom = " "
if nom:
print("Bonjour")
else:
print("Nom manquant")BonjourNom manquanta) 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)
Écrivez un programme qui classe un âge dans les catégories suivantes :
bébéenfantadolescentadulteseniorage = int(input("Votre âge : "))
# Votre code avec if/elif/elsedef 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
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.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
Écrivez un programme qui vérifie qu’un mot de passe remplit les critères suivants :
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 manquantsdef 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.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
Un magasin applique des remises selon le montant d’achat :
É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 finaldef 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 €
if, elif, else → choisir entre plusieurs branches. Un seul bloc s’exécute (celui de la première condition vraie).: en fin de if/elif/else sont obligatoires.and, or, not pour combiner. Court-circuit utile pour éviter des erreurs.if x: teste la véracité implicite — 0, "", [], None… sont falsy.a if cond else b — utile pour les affectations simples.← Chapitre précédent : Les chaînes • Chapitre suivant : Les listes →