Tom Daluzeau
← Parcours Python
Python · leçon 2 / 5Ch. 1 · Bases10 minTerminée

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 = 80 range 80 dans port ;
  • port == 80 demande si port vaut 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.

0 False 8001 True 70000 False 1 65535 1 <= port <= 65535 1 <= 0 est faux les deux comparaisons sont vraies 70000 <= 65535 est faux
1 <= port <= 65535 est vrai seulement à l'intérieur de l'intervalle, bornes comprises.

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, mais port == 80 est faux. Un seul faux suffit à faire tomber le and.
  • or : port == 80 est faux, mais port == 22 est vrai. Un seul vrai suffit pour le or.
  • not : port == 80 est faux, donc not le 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 :

  1. not 1 <= 80 <= 65535 : l’intervalle est vrai, not le rend faux. On continue.
  2. 80 < 1024 : vrai. Python affiche système et sort du bloc.
  3. port == 80 serait vrai aussi, mais il n’est jamais testé.

L’ordre des branches compte donc : mets les cas les plus précis en premier.

port = 80 not 1 <= port <= 65535 print("invalide") faux port < 1024 vrai print("système") port == 80 jamais testée print("web") on sort du bloc suite du programme
Python descend, s'arrête à la première condition vraie, exécute sa branche et sort du bloc.

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 ?

if puis elif : une seule branche if port < 1024 système lié au if : sauté s'il est vrai elif port == 80 web affiche : système if puis if : deux tests séparés if port < 1024 système aucun lien : toujours testé if port == 80 web affiche : système, puis web
elif est lié au if qui précède. Un second if repart de zéro : les deux branches peuvent s'exécuter.

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 True ou False. = range une valeur, == compare.
  • 1 <= port <= 65535 veut dire 1 <= 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.

Cartes · 7

Réviser les cartes ici

Espace : retourner