Définition
Un programme qui déroule toujours les mêmes lignes dans le même ordre ne sait faire qu'une seule chose. Or dès qu'il touche au réel, il rencontre des cas de figure : un visiteur connecté ou anonyme, un panier vide ou rempli, un fichier présent ou absent. Il lui faut donc un moyen de dire « cette partie du code, seulement dans cette situation ».
C'est le rôle de if. Cette instruction exécute un bloc de code uniquement lorsqu'une condition est vraie, et le saute purement et simplement dans le cas contraire. C'est la forme la plus simple de décision : le programme choisit son chemin d'après ce qu'il constate au moment où il passe, et non d'après ce qui était prévisible au moment où vous l'avez écrit.
Voici la forme minimale, trois lignes qui décident si une phrase s'affiche ou non.
age = 20
# La condition est vraie, la ligne indentée s'exécute
if age >= 18:
print("Majeur")Deux détails de syntaxe portent tout le reste. La condition se termine par un deux-points, qui annonce le bloc à venir, et ce bloc est décalé vers la droite, de quatre espaces par convention.
Cette indentation n'est pas décorative : c'est elle, et elle seule, qui indique à Python où commence et où finit le bloc conditionnel. Ce que les autres langages enferment entre accolades, Python le lit dans la mise en page. La conséquence est très concrète : une ligne que vous ramenez de quatre espaces vers la gauche sort du if et s'exécutera dans tous les cas, sans qu'aucun message ne vienne vous prévenir.
Reste la question que l'on se pose en découvrant cette forme : que se passe-t-il quand la condition est fausse ? Rien, et c'est exactement le point. Le bloc est ignoré, le programme reprend à la première ligne revenue à la hauteur du if, et continue son chemin. Un if sans rien derrière est parfaitement valide : il n'oblige à prévoir aucune branche pour le cas contraire.
Les parenthèses autour de la condition ne servent à rien. if (age >= 18): fonctionne, parce que Python y voit les parenthèses d'une expression ordinaire, mais personne ne les écrit. Le réflexe vient de JavaScript, de Java ou de C, où elles sont obligatoires.
Ce que Python considère comme vrai
Une condition n'a pas besoin d'être une comparaison. N'importe quelle valeur peut être placée après if, et Python se charge de la ramener à vrai ou à faux. Sa règle est simple à retenir : ce qui est vide ou nul est faux, tout le reste est vrai.
Le tableau ci-dessous récapitule le côté faux, c'est-à-dire celui qu'il faut connaître, l'autre se déduisant par élimination.
| Valeur testée | Résultat |
|---|---|
0, 0.0 | Faux |
| Chaîne vide | Faux |
| Liste, dictionnaire ou set vide | Faux |
None | Faux |
| Tout le reste | Vrai |
Cette règle explique une écriture que vous croiserez dans tous les projets Python : if ma_liste:, qui se lit « si la liste contient quelque chose ». Elle remplace avantageusement if len(ma_liste) > 0:, plus long à écrire, plus long à lire, et qui ne dit rien de plus.
Le revers apparaît dès que la valeur testée peut légitimement valoir zéro. 0 et None sont tous deux faux alors qu'ils racontent des choses très différentes : le premier est une réponse, le second une absence de réponse. Quand cette distinction compte, ne vous reposez pas sur la règle générale et testez explicitement avec is None.
L'erreur ne lève aucune exception, elle produit un résultat faux. Un stock à 0, une note à 0, une remise à 0 pour cent : avec if stock:, le code range toutes ces valeurs dans la même branche que « aucune donnée », et le défaut n'apparaît qu'au moment où un client s'en plaint.
Enchaîner et conclure
Un if isolé ne couvre que deux issues : la condition est vraie, ou il ne se passe rien. La plupart des décisions réelles en comptent davantage, et Python fournit deux mots pour les écrire.
elif ajoute un test supplémentaire, évalué seulement si tous ceux qui le précèdent ont échoué. else ferme la chaîne et ramasse ce qu'aucune branche n'a attrapé. Une seule branche s'exécute, toujours la première dont la condition est vraie.
Cela entraîne une conséquence facile à oublier : les tests suivants ne sont pas simplement ignorés, ils ne sont jamais évalués. L'ordre dans lequel vous écrivez les branches fait donc partie de la logique, au même titre que les conditions elles-mêmes.
L'exemple ci-dessous traduit une note sur 20 en mention. Regardez l'ordre des seuils autant que les seuils eux-mêmes.
note = 14
# Python descend les tests un par un et s'arrête au premier qui est vrai
if note >= 16:
mention = "très bien"
elif note >= 14:
mention = "bien"
elif note >= 12:
mention = "assez bien"
else:
mention = "passable"Suivez Python sur cet exemple. Il essaie note >= 16, faux avec 14. Il passe au test suivant, note >= 14, qui est vrai : il affecte « bien », puis quitte la chaîne. Le troisième test et le else ne sont même pas regardés. Intervertissez les deux premières branches, et la même note ressortira avec « assez bien », sans la moindre erreur affichée.
Il arrive enfin que la décision serve uniquement à choisir une valeur, comme ici. Python propose alors une forme condensée sur une ligne, l'expression conditionnelle : statut = "majeur" if age >= 18 else "mineur". Elle rend service quand le choix tient en quelques mots, et devient illisible dès qu'on tente d'y loger trois cas.
Questions fréquentes
Pourquoi Python n'a-t-il pas de switch ?
Pendant longtemps, la réponse était qu'il n'en avait pas besoin : une chaîne de elif couvre le même besoin, et un dictionnaire fait un aiguillage encore plus lisible quand les cas se ressemblent. Depuis la version 3.10, l'instruction match comble le manque, avec en prime la reconnaissance de motifs : elle sait décomposer un tuple ou reconnaître la forme d'un dictionnaire, bien au-delà d'un simple aiguillage sur une valeur.
Quelle est la différence entre = et == dans une condition ?
Le simple signe affecte une valeur à une variable, le double compare deux valeurs et renvoie un bool. Écrire if x = 5: ne s'exécute pas du tout et déclenche une SyntaxError, ce qui est une bonne nouvelle : dans les langages qui autorisent l'affectation à l'intérieur d'un test, la même faute de frappe donne une condition toujours vraie et un bug parfaitement silencieux.
Peut-on combiner plusieurs conditions dans un seul if ?
Oui, avec les opérateurs and, or et not. Python les évalue paresseusement : dans un and, si le premier test est faux, le second n'est jamais exécuté. Cette propriété sert à protéger un accès risqué, comme if items and items[0], où la seconde partie n'est atteinte que si la liste contient au moins un élément.