Conditions : if, elif, else
Écrire et surtout lire une condition : comparaisons, comparaisons enchaînées, and / or / not, et savoir quelle branche d'un if / elif / else s'exécute.
Mis à jour le
Pourquoi on voit ça
Un script de supervision décide en permanence : ce port est-il valide ? Ce serveur est-il en prod ? Faut-il lever une alerte ? Chaque décision est une condition.
Écrire un if est facile. Le lire sans se tromper l’est moins, et c’est ce qu’on te demande au contrôle : on te donne un bloc if / elif / else et tu dois dire ce qui s’affiche. Le piège habituel : plusieurs conditions sont vraies, mais une seule branche s’exécute.
Les comparaisons
Une comparaison donne toujours un bool : True ou False.
| Opérateur | Sens | Exemple | Résultat |
|---|---|---|---|
== |
égal | 80 == 80 |
True |
!= |
différent | 80 != 443 |
True |
< |
plus petit | 80 < 1024 |
True |
<= |
plus petit ou égal | 1024 <= 1024 |
True |
> |
plus grand | 80 > 1024 |
False |
>= |
plus grand ou égal | 80 >= 80 |
True |
Ne confonds pas = et == :
port = 80range 80 dansport;port == 80demande siportvaut 80.
Et rappelle-toi la leçon sur les types : "80" == 80 vaut False. Un texte n’est jamais égal à un nombre.
Comparaisons enchaînées
Python permet d’écrire un intervalle comme en maths :
port = 8001
print(1 <= port <= 65535)
1 <= port <= 65535 veut dire exactement 1 <= port and port <= 65535. Les deux comparaisons doivent être vraies.
port = 70000
print(1 <= port <= 65535)
False
Ici 1 <= 70000 est vrai, mais 70000 <= 65535 est faux. Le tout est donc faux.
and, or, not
Trois mots pour combiner des conditions.
| Mot | Vrai quand… | Exemple |
|---|---|---|
and |
les deux côtés sont vrais | env == "prod" and port == 80 |
or |
au moins un côté est vrai | port == 80 or port == 443 |
not |
ce qui suit est faux | not up |
env = "prod"
port = 22
print(env == "prod" and port == 80)
print(port == 80 or port == 22)
print(not port == 80)
Lis ces lignes une par une :
and:env == "prod"est vrai, maisport == 80est faux. Un seul faux suffit à faire tomber leand.or:port == 80est faux, maisport == 22est vrai. Un seul vrai suffit pour leor.not:port == 80est faux, doncnotle retourne en vrai.
not se combine très bien avec une comparaison enchaînée pour dire « en dehors de l’intervalle » :
port = 0
if not 1 <= port <= 65535:
print("invalide")
invalide
Une erreur fréquente : écrire port == 80 or 443 en pensant « 80 ou 443 ». Chaque côté d’un or doit être une condition complète : port == 80 or port == 443.
if / elif / else
port = 8080
if port < 1024:
print("système")
elif port == 8080:
print("web de test")
else:
print("libre")
La forme :
if condition:avec les deux-points à la fin ;- le bloc dessous est décalé de 4 espaces : c’est ce décalage qui dit à Python ce qui appartient à la branche ;
elif(« sinon si ») ajoute un test, autant de fois que tu veux ;else(« sinon ») est facultatif, sans condition, et toujours en dernier.
Une seule branche : la première vraie
C’est la règle la plus importante de la leçon. Python teste les conditions de haut en bas. Dès qu’il en trouve une vraie, il exécute cette branche et saute tout le reste du bloc, même si d’autres conditions plus bas sont vraies elles aussi.
port = 80
if not 1 <= port <= 65535:
print("invalide")
elif port < 1024:
print("système")
elif port == 80:
print("web")
système
Déroule à la main :
not 1 <= 80 <= 65535: l’intervalle est vrai,notle rend faux. On continue.80 < 1024: vrai. Python affichesystèmeet sort du bloc.port == 80serait vrai aussi, mais il n’est jamais testé.
L’ordre des branches compte donc : mets les cas les plus précis en premier.
Deux if ne font pas un elif
Si tu remplaces elif par if, tu obtiens deux tests indépendants. Les deux peuvent s’exécuter.
port = 80
if port < 1024:
print("système")
if port == 80:
print("web")
système
web
Au contrôle, regarde donc bien chaque mot-clé avant de répondre : if ou elif ?
Sans else, il peut ne rien se passer
port = 5432
if port == 80:
print("web")
elif port == 443:
print("https")
print("fin")
fin
Aucune condition n’est vraie et il n’y a pas de else : aucune branche ne s’exécute. La ligne print("fin") n’est pas décalée, elle est donc en dehors du bloc et s’exécute toujours.
À retenir
- Une comparaison donne
TrueouFalse.=range une valeur,==compare. 1 <= port <= 65535veut dire1 <= port and port <= 65535.and: les deux vrais.or: au moins un vrai.not: inverse.- Dans un
if / elif / else, une seule branche s’exécute : la première vraie, de haut en bas. - Deux
ifà la suite sont deux tests indépendants : les deux peuvent s’exécuter. - Sans
else, si rien n’est vrai, rien ne s’exécute.
Entraînement
12 questions, dont 4 à compléter. Tu réponds, on passe à la suivante. La note arrive à la fin.
Ta note
Cartes · 7
Réviser les cartes ici
Pourquoi