Retour au cours

conditions : if / elif / else, expressions conditionnelles

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, not et in
  • utiliser l’expression conditionnelle X if cond else Y
  • appliquer des guard clauses pour aplatir le code
  • éviter les pièges (= vs ==, tests avec none, 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 is pour comparer des nombres/chaînes (préférez ==)
  • oublier is None / is not None pour tester none
  • dépendre de la précédence de and/or au lieu d’ajouter des parenthèses
  • ternaires imbriqués illisibles (préférez un if clair)

exercices

  1. signe écrivez sign(x) qui retourne "neg", "zero" ou "pos".

  2. tarif cinéma fonction ticket_price(age, is_student) :

  • < 12 → 6
  • 12–25 → 8 (6 si étudiant)
  • > 25 → 12 (8 si étudiant)
  1. année bissextile is_leap(year) renvoie True si année divisible par 4 et (pas divisible par 100 ou divisible par 400).

  2. normaliser un nom normalize_name(s) : si s est vide ou none, renvoyer "inconnu", sinon s.strip().title().

  3. fizzbuzz pour 1..100, imprimez "fizz" si multiple de 3, "buzz" si multiple de 5, "fizzbuzz" si des deux, sinon le nombre.

  4. plage sûre in_safe_range(x, lo, hi, allow_none=False) : renvoie False quand x is None sauf si allow_none vaut True.

dépannage

  • branche jamais atteinte : vérifiez l’ordre des conditions (elif exclusif)
  • résultats surprenants avec and/or : souvenez-vous qu’ils renvoient une valeur, utilisez bool(...) 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