dans cette leçon, vous apprenez à diriger le flot d’exécution avec if / elif / else, à composer des tests lisibles, à utiliser l’expression conditionnelle (ternaire) et à éviter l’imbrication excessive grâce aux guard clauses.
objectifs
- écrire des branches avec
if,elif,else - combiner des conditions avec
and,or,notetin - utiliser l’expression conditionnelle
X if cond else Y - appliquer des guard clauses pour aplatir le code
- éviter les pièges (
= vs ==, tests avecnone, précédence)
syntaxe de base
age = 20
if age >= 18:
statut = "majeur"
elif age >= 16:
statut = "apprenti"
else:
statut = "mineur"
print(statut)
vérité et tests fréquents
- valeurs falsy :
False,None,0,"",[],{},set() - tester le vide ou l’absence :
name = " "
if not name.strip():
print("nom manquant")
- tester
none:
data = None
if data is None:
print("aucune donnée")
conditions composées
utilisez des parenthèses pour la lisibilité quand nécessaire.
score = 72
if (60 <= score <= 100) and (score != 69):
print("admis")
appartenance :
ext = ".csv"
if ext in {".csv", ".tsv"}:
print("tabulaire")
expression conditionnelle (ternaire)
forme compacte pour produire une valeur selon une condition.
age = 17
label = "majeur" if age >= 18 else "mineur"
utile dans des f-strings :
n = 1
print(f"{n} {'élément' if n == 1 else 'éléments'}")
guard clauses (éviter les pyramides de if)
retourner tôt quand un cas invalide est détecté.
def ratio(a: float, b: float) -> float | None:
if b == 0:
return None
return a / b
structurer des catégories
def categorie_bmi(bmi: float) -> str:
if bmi < 18.5:
return "insuffisance pondérale"
if bmi < 25:
return "normal"
if bmi < 30:
return "surpoids"
return "obésité"
validation simple d’entrée
raw = input("votre âge ? ").strip()
if not raw.isdigit():
print("âge invalide")
else:
age = int(raw)
print("ok" if age >= 0 else "âge invalide")
mini exemples exécutables
# classification température
t = 22
if t < 0:
print("gel")
elif t < 18:
print("frais")
elif t < 26:
print("doux")
else:
print("chaud")
# message selon présence de paramètre
def greet(name: str | None) -> str:
if not name:
return "bonjour, invité·e"
return f"bonjour, {name.strip().title()}"
# validation d'extension de fichier
def is_image(filename: str) -> bool:
ext = filename.lower().rsplit(".", 1)[-1] if "." in filename else ""
return ext in {"png", "jpg", "jpeg", "webp"}
# choix par priorités avec or
env = "" # ex: lu depuis une variable d'environnement
profile = env or "dev"
print(profile)
pièges courants
=(affectation) n’est pas==(comparaison)- utiliser
ispour comparer des nombres/chaînes (préférez==) - oublier
is None/is not Nonepour testernone - dépendre de la précédence de
and/orau lieu d’ajouter des parenthèses - ternaires imbriqués illisibles (préférez un
ifclair)
exercices
-
signe écrivez
sign(x)qui retourne"neg","zero"ou"pos". -
tarif cinéma fonction
ticket_price(age, is_student):
< 12→ 612–25→ 8 (6 si étudiant)> 25→ 12 (8 si étudiant)
-
année bissextile
is_leap(year)renvoieTruesi année divisible par 4 et (pas divisible par 100 ou divisible par 400). -
normaliser un nom
normalize_name(s): sisest vide ounone, renvoyer"inconnu", sinons.strip().title(). -
fizzbuzz pour
1..100, imprimez"fizz"si multiple de 3,"buzz"si multiple de 5,"fizzbuzz"si des deux, sinon le nombre. -
plage sûre
in_safe_range(x, lo, hi, allow_none=False): renvoieFalsequandx is Nonesauf siallow_nonevautTrue.
dépannage
- branche jamais atteinte : vérifiez l’ordre des conditions (
elifexclusif) - résultats surprenants avec
and/or: souvenez-vous qu’ils renvoient une valeur, utilisezbool(...)si besoin - tests sur chaînes :
if s:teste le non-vide,s.strip()pour ignorer les espaces - duplication de logique : extrayez des fonctions (
is_image,is_valid_age, etc.) pour clarifier et réutiliser