Les conditions if/else et les opérateurs and/or/not semblent simples. En apparence seulement. Ce chapitre explore les subtilités que le TOSA teste massivement : court-circuit, idiomes pythoniques (le or de valeur par défaut), clause else des boucles, et rappels de priorité d'opérateurs.
Différence entre is et == (rappel)
Vu au chapitre précédent, on en fait un résumé pour ce chapitre :
==teste si les valeurs sont égales.isteste si les deux noms pointent vers le même objet en mémoire.
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print("a == b :", a == b) # True : même contenu
print("a is b :", a is b) # False : objets différents
print("a is c :", a is c) # True : aliasRègle pratique :
isavecNone,True,False.==pour comparer des valeurs.
La logique booléenne avancée
Le court-circuit
Principe : Python évalue les opérateurs logiques de gauche à droite et s'arrête dès qu'il peut conclure.
A and B: siAest faux → ne pas évaluerB, retournerA.A or B: siAest vrai → ne pas évaluerB, retournerA.
Démonstration avec une fonction qui affiche quand elle est appelée :
def verifier(x):
print(f" → vérification de {x}")
return x > 0
print("Test `and` avec échec à gauche :")
resultat = verifier(-5) and verifier(10) # verifier(10) pas exécuté !
print("Résultat :", resultat)def verifier(x):
print(f" → vérification de {x}")
return x > 0
print("\nTest `or` avec succès à gauche :")
resultat = verifier(5) or verifier(10) # verifier(10) pas exécuté !
print("Résultat :", resultat)Application concrète : éviter une division par zéro.
def est_valide(x):
return x != 0 and 10 / x > 2 # la 2e partie NE S'ÉVALUE PAS si x == 0
print(est_valide(0)) # False, pas de ZeroDivisionError
print(est_valide(3)) # True
print(est_valide(10)) # False (10/10 = 1 < 2)Idiome courant : valeur par défaut avec or
Une conséquence pratique de ce comportement : on peut utiliser or pour fournir une valeur par défaut quand une variable peut être vide ou None.
def saluer(nom):
nom = nom or "inconnu" # si nom est "", None, 0... → "inconnu"
print(f"Bonjour {nom}")
saluer("Alice")
saluer("")
saluer(None)C'est un idiome classique en Python. Équivalent plus explicite :
if not nom:
nom = "inconnu"Les valeurs falsy et truthy (rappel)
Python évalue n'importe quelle valeur comme booléen. Voici la liste des valeurs falsy :
| Type | Valeur(s) falsy |
|---|---|
| Nombres | 0, 0.0, 0j |
| Chaîne | "" (vide) |
| Collection | [], (), {}, set() |
| Spécial | None, False |
Tout le reste est truthy.
for valeur in [0, "", [], {}, None, False, 1, "a", [0], "False"]:
print(f"{str(valeur):<12} → {bool(valeur)}")