Mon Labo Python

Comprendre les opérateurs logiques and or en python pour ses conditions

Écran d'ordinateur affichant une condition Python avec and et or, pour une débutante qui apprend la logique de programmation

Quatre. Il n'existe que quatre façons de combiner deux conditions avec 'and' ou 'or' en Python, pas une de plus, et pourtant cette portion de logique de programmation a la réputation d'être le mur où trébuchent la plupart des débutants qui apprennent seuls, moi la première. Je suis tombée dedans avec mes conditions if, en tapant une ligne qui me semblait limpide et qui ne l'était pas du tout.

Beaucoup de débutants, moi y compris au tout début, pensent qu'écrire 'or' entre deux mots revient à donner une liste de choix à Python, un peu comme on dirait à quelqu'un "prends ceci, ou cela, ou encore ça". Ce n'est pas ça du tout, et c'est exactement le genre de malentendu qui fait planter un script sans le moindre message pour vous prévenir : le programme tourne, il répond, mais il ment.

Pourquoi ce 'or' accepte-t-il n'importe quoi dans une condition if ?

Voici ce que j'avais écrit, un soir où je voulais juste que mon programme me dise si j'irais marcher dans le quartier Montferrand le lendemain : if meteo == "soleil" or "nuageux":. Sur le papier, ça se lit comme une phrase normale, "si la météo est ensoleillée ou nuageuse". Sauf que Python ne lit pas des phrases, il lit deux tests séparés de part et d'autre du 'or'. Le premier, c'est "est-ce que meteo est égal à soleil". Le second, c'est juste le mot "nuageux" tout seul, sans rien pour le comparer — et un mot tout seul, en Python, compte presque toujours comme vrai du moment qu'il n'est pas vide. Résultat : la condition entière répondait oui, qu'il pleuve, qu'il neige ou qu'il fasse un soleil de plomb.

La correction tient en une poignée de caractères : if meteo == "soleil" or meteo == "nuageux":. Chaque camp du 'or' redevient un test complet, avec sa propre comparaison, et cesse d'être un simple mot livré à lui-même. C'est la règle à retenir, plus utile que n'importe quelle explication savante : avant d'écrire 'or' ou 'and', il faut pouvoir remplacer chacun des deux côtés par 'True' ou 'False' tout seul, sans dépendre du bout de phrase d'à côté. Si ce n'est pas le cas, la condition ment.

Carnet de notes avec une table de vérité and or dessinée à la main pour comprendre les conditions Python

Quatre combinaisons possibles, jamais plus

Le nombre ne bouge jamais : avec deux conditions et deux issues chacune, vrai ou faux, on obtient quatre cas de figure, ni plus ni moins. Avec 'and', un seul faux suffit à tout faire tomber. Avec 'or', un seul vrai suffit à tout faire tenir. Python le sait si bien qu'il n'attend même pas de lire la suite dans certains cas : s'il tombe sur un premier 'vrai' du côté d'un 'or', il ne se donne pas la peine de vérifier le reste, il a déjà sa réponse. J'avais déjà tâtonné avec d'autres briques du langage, comme quand j'ai voulu apprendre les opérateurs mathématiques en python pour progresser enfin, mais la logique booléenne touchait à un tout autre réflexe.

Ce piège, je l'ai revécu quelques semaines plus tard avec une liste de codes que Valérian, mon collègue de bureau, m'avait passée en espérant vaguement qu'un jour j'automatise son tri du lundi matin. Je voulais repérer les lignes marquées "urgent" ou "en retard", et j'ai failli refaire exactement la même erreur. Le lendemain, en me voyant arriver la tête dans le brouillard, il a posé sur mon bureau les deux cafés habituels du distributeur — le sien et le mien — sans un mot de plus.

Le 'ou' inclusif contre le choix du menu

Au restaurant, quand la formule propose fromage ou dessert, tout le monde comprend qu'il faut choisir : c'est l'un ou l'autre, jamais les deux à la fois. Le 'or' de Python ne fonctionne pas comme ça. Il est inclusif : il répond oui dès qu'une des deux conditions est vraie, et il répond encore oui si les deux le sont en même temps. Confondre les deux logiques, c'est la deuxième source de malentendu la plus fréquente que j'ai croisée en cherchant pourquoi ça clochait chez moi.

Carte de randonnée posée à côté d'un ordinateur portable pendant une pause dans l'apprentissage des conditions Python

Vérifier sa condition avant de lancer le script

Avant d'appuyer sur Entrée, j'ai pris l'habitude de relire chaque 'and' et chaque 'or' à voix basse, en remplaçant mentalement chaque camp par vrai ou faux tout seul. Si un des deux mots ne tient pas debout sans le reste de la phrase, la condition est cassée. Je me suis même amusée à vérifier ce réflexe en allant utiliser le module random en python pour créer son premier jeu, histoire de voir comment mes conditions réagissaient à des valeurs que je ne contrôlais pas.

Ce réflexe ne m'est pas venu tout seul. Pendant un moment, j'avais essayé d'apprendre en regardant des tutoriels vidéo le soir sans ouvrir l'ordinateur en même temps, en pensant que ça suffirait à faire rentrer la logique. Ça n'a jamais tenu face à un bug pareil : sans les mains sur le clavier, sans voir le script mentir sous mes yeux, je ne l'aurais jamais repéré.

Je me souviens d'être restée devant l'écran ce soir-là, refusant de fermer l'ordinateur avant d'avoir compris pourquoi trois malheureux mots suffisaient à rendre mon script aveugle à la pluie. Après deux ans à apprendre le soir en autodidacte, ce genre de piège me surprend encore, et c'est peut-être bon signe. Le lendemain, en allant marcher dans le quartier Montferrand pour aérer la tête, je me suis surprise à réciter la règle des deux camps comme une comptine.

Théophane, qui commente le journal depuis Lyon et qui n'a jamais caché qu'il n'était plus du tout dans ses vingt ans, m'a écrit un message pareil il y a peu : lui aussi avait buté sur un 'or' qui disait oui à tout, dans un tableau qu'il essayait de trier pour son travail. Ça m'a rassurée de savoir que ce n'est pas une question d'âge ni de talent, juste une manière de lire qu'on n'a pas encore. Reste une chose que je n'ai toujours pas tranchée : comment mélanger 'and' et 'or' dans la même ligne sans se perdre dans les parenthèses. Celle-là, je la garde pour un autre soir.

Articles connexes