Une condition en Python : faire dépendre le code d'un test

Une condition est le test que Python évalue à vrai ou à faux pour décider si un bloc de code doit s'exécuter, ou être ignoré.
5 min de lecture
Believemy logo

Définition

Un programme qui déroule toujours les mêmes instructions dans le même ordre ne sait traiter qu'un seul cas de figure : les mêmes frais de port pour tous les paniers, quel que soit le client. Pour qu'il s'adapte, il lui faut un endroit où il regarde ce qu'il a sous la main avant de décider de la suite.

Une condition est cet endroit : une expression que Python évalue à vrai ou à faux, et dont dépend l'exécution d'un bloc de code. Si elle est vraie, le bloc s'exécute. Si elle est fausse, Python passe par-dessus et reprend plus bas, comme si ces lignes n'existaient pas.

Le mot désigne le test lui-même, pas la syntaxe qui l'accueille. C'est pour cela qu'on le retrouve à plusieurs endroits du langage : derrière un if, derrière un elif, derrière un while, où il décide si la boucle repart pour un tour, et jusque dans les compréhensions.

Voici la forme la plus courante : un test, deux points, puis un bloc indenté qui ne s'exécute que si le test passe.

PYTHON
if panier.total > 50 and client.est_actif:
    # Ce bloc ne s'exécute que si les deux parties du test sont vraies
    appliquer_livraison_gratuite()


Les comparateurs

Reste à écrire le test lui-même. La question posée est presque toujours une comparaison entre deux valeurs : ce total dépasse-t-il le seuil, cette réponse est-elle celle qu'on attendait ?

Six écritures couvrent l'essentiel. Le tableau ci-dessous donne pour chacune le moment exact où Python la juge vraie.

ÉcritureVrai quand
==Les deux valeurs sont égales
!=Elles diffèrent
< et >L'une est strictement inférieure ou supérieure
<= et >=Idem, en incluant l'égalité
inLa valeur appartient à une collection
isLes deux noms désignent le même objet

Les deux dernières lignes sortent du lot. in ne compare pas deux valeurs, il demande si une valeur se trouve dans une collection. is non plus : il demande si deux noms désignent le même objet en mémoire. D'où une erreur classique : écrire is pour comparer des valeurs marche sur de petits entiers, par accident, puis devient faux plus loin.

Python autorise en plus une écriture que peu de langages permettent : le chaînage. if 0 <= note <= 20: se lit comme en mathématiques et n'évalue note qu'une seule fois.


Tout objet a une valeur de vérité

Une condition n'est pas obligée d'être une comparaison. Vous pouvez y placer n'importe quelle valeur, une liste, une chaîne, un nombre ou un objet, et Python se charge de la ramener à vrai ou à faux.

Il applique pour cela la même règle à tout : ce qui est vide, nul ou None est faux, tout le reste est vrai. Une liste sans élément est donc fausse, une chaîne sans caractère aussi.

Vous n'avez donc plus besoin de compter pour savoir s'il y a quelque chose. Au lieu de mesurer avec len puis de comparer le résultat à zéro, vous écrivez if resultats:, qui se lit « s'il y a des résultats ».

Attention

Ce raccourci devient un piège dès que zéro est une valeur légitime. if quantite: écarte silencieusement une quantité nulle, qui n'est pourtant pas une absence de quantité, et le défaut ne se voit ni à la relecture ni sur les jeux d'essai habituels. Quand zéro veut dire quelque chose, écrivez la comparaison en toutes lettres : if quantite > 0:.


Combiner sans se tromper

Une décision réelle repose rarement sur un seul test : la livraison gratuite s'applique au-dessus d'un certain montant et aux clients actifs seulement.

Trois opérateurs relient les conditions entre elles : and, qui exige que les deux parties soient vraies, or, qui se contente d'une seule, et not, qui inverse un test.

Python les évalue paresseusement : il lit de gauche à droite et s'arrête dès que le résultat est acquis. Dans un and, une première partie fausse rend déjà l'ensemble faux, donc la seconde n'est jamais exécutée.

PYTHON
# Si client vaut None, Python s'arrête là : la seconde partie n'est pas évaluée
if client is not None and client.est_actif:
    ...

Ce n'est pas un détail d'optimisation, c'est un outil de protection : la première partie du test garantit que la seconde ne s'exécutera que sur un objet qui existe. Inverser les deux membres produirait une AttributeError dès que client vaut None.

L'ordre des tests porte donc du sens : ce qui protège vient d'abord. Et quand une condition s'allonge, and passe avant or : des parenthèses explicites valent mieux qu'un pari sur la priorité.


Questions fréquentes

Question

Pourquoi ma condition est-elle toujours vraie ?

Le cas le plus fréquent est une valeur non vide qui sert de test sans qu'on s'en rende compte, comme dans if reponse == "oui" or "OUI":. Python lit ici deux conditions séparées, et la chaîne "OUI" toute seule est non vide, donc toujours vraie. L'écriture correcte passe par in : if reponse in ("oui", "OUI"):.

Question

Faut-il écrire == True dans une condition ?

Non, c'est redondant : if actif: dit déjà ce que if actif == True: exprime en plus long, puisque Python ramène de toute façon la valeur à vrai ou à faux. La comparaison explicite ne se justifie que si la variable peut contenir autre chose qu'un booléen.

Question

Comment tester plusieurs valeurs possibles ?

Avec in et une collection, qui reste lisible même avec dix valeurs, plutôt qu'avec une longue chaîne de or où l'on finit par oublier de répéter la variable. Savoir choisir la bonne écriture pour une condition est l'un des premiers réflexes que travaille notre formation Python.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.