True et False — apprendre à poser des questions
Opérateurs de comparaison, and / or / not, comparaisons enchaînées et valeurs que Python considère comme fausses — les bases pour écrire des conditions.
Comment voulez-vous apprendre ?
Le problème que nous résolvons
Un programme doit parfois trancher : cette commande donne-t-elle droit à une remise ? Le mot de passe est-il assez long ? L'article est-il en stock ?
Le code qui tranche arrive au chapitre suivant (if). Mais avant cela, il faut la chose sur laquelle repose la décision : une question dont la réponse est oui ou non. En Python, ces réponses s'appellent True et False, et le type s'appelle bool.
Aujourd'hui, nous apprenons seulement à poser la question, pas à décider. Ce découpage est volontaire : presque toutes les erreurs commises en écrivant un if viennent en fait de la question posée, et non du if lui-même.
À la fin de ce chapitre, vous pourrez
- Utiliser les six opérateurs de comparaison
- Distinguer
=et== - Combiner de petites questions en plus grandes avec
and,oretnot - Écrire des comparaisons enchaînées comme
18 <= age <= 60 - Dire quelles valeurs Python considère comme fausses sans être
False
Prérequis : Lire la saisie de l'utilisateur — input() et conversion de types.
Les six comparaisons
age = 22
print(age == 22)
print(age != 22)
print(age > 18)
print(age < 18)
print(age >= 22)
print(age <= 21)True
False
True
False
True
FalseChaque comparaison produit une valeur : True ou False. Une comparaison peut donc être stockée dans une variable :
age = 22
is_adult = age >= 18
print(is_adult)
print(type(is_adult))True
<class 'bool'>Ce nom rend le code beaucoup plus lisible : is_adult dit ce qui est vérifié, alors que age >= 18 oblige le lecteur à le deviner.
= et == — un caractère, deux sens
total = 100 # an instruction: put 100 into total
print(total == 100) # a question: is total 100?True=stocke (affectation)==pose une question (comparaison)
Si vous écrivez = là où une condition est attendue, Python 3 lève une erreur claire, accompagnée d'un message utile :
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?Bonne nouvelle : cette erreur ne passe pas inaperçue, elle est détectée.
Comparer du texte
print("rafi" == "rafi")
print("Rafi" == "rafi")
print("apple" < "banana")
print(len("password123") >= 8)True
False
True
TrueDeux points à remarquer :
La casse compte. "Rafi" n'est pas égal à "rafi". Quand vous comparez un texte tapé par quelqu'un, appelez d'abord .strip().lower() — sinon, une personne qui a mis une majuscule à son prénom ou tapé un espace en trop serait exclue :
typed = " RAFI "
print(typed == "rafi")
print(typed.strip().lower() == "rafi")False
True< fonctionne aussi sur le texte, selon l'ordre alphabétique, comme dans un dictionnaire — d'où "apple" < "banana". C'est la base du tri d'une liste de noms.
and, or, not
Trois mots permettent de combiner de petites questions en de plus grandes :
age = 22
has_id = True
print(age >= 18 and has_id)
print(age >= 60 or has_id)
print(not has_id)True
True
Falseand— vrai quand les deux sont vraisor— vrai quand au moins un est vrainot— inverse le résultat
Le tableau complet, d'un coup d'œil :
print(True and True)
print(True and False)
print(False and False)
print(True or False)
print(False or False)True
False
False
True
Falseorsignifie « un ou plusieurs », pas « exactement un ». Dans la langue courante, « thé ou café ? » sous-entend qu'on en choisit un. Leorde Python vautTruemême quand les deux côtés sont vrais. Si vous l'oubliez, vos conditions vous surprendront.
not s'applique toujours à ce qui le suit immédiatement, et il est évalué en premier. L'ordre est donc : d'abord not, puis and, et or en dernier.
print(True or False and False)
print((True or False) and False)True
FalseSur la première ligne, and a été évalué en premier : Python a donc lu True or (False and False), c'est-à-dire True or False, soit True. Sur la seconde, les parenthèses ont changé l'ordre. En cas de doute, utilisez des parenthèses — c'est aussi vrai ici qu'en arithmétique.
Comparaisons enchaînées
Pour vérifier qu'une valeur se trouve entre deux bornes, Python permet de l'écrire comme en mathématiques :
marks = 72
print(0 <= marks <= 100)
print(marks > 60 and marks < 80)
print(60 < marks < 80)True
True
TrueLes deuxième et troisième lignes disent la même chose, mais la troisième se lit mieux. Beaucoup de langages de programmation ne l'autorisent pas ; Python, si, et vous devriez en profiter.
Les valeurs que Python considère comme fausses
Ce n'est pas seulement False — quelques valeurs ordinaires sont considérées comme fausses aussi :
print(bool(0))
print(bool(1))
print(bool(-5))
print(bool(""))
print(bool("hello"))
print(bool("0"))
print(bool("False"))False
True
True
False
True
True
TrueLa règle en une ligne : zéro et les contenus vides sont faux, tout le reste est vrai. Donc 0 est faux, et le texte vide "" aussi ; mais -5 est vrai (il n'est pas nul), et "0" et "False" sont vrais — parce qu'ils ne sont pas vides, ils contiennent des caractères.
Ces deux dernières lignes sont le vrai piège. Tout ce que renvoie input() est du texte : même quand la personne tape 0, vous obtenez "0" — que Python considère comme vrai. Pour comparer des nombres, il faut donc d'abord convertir avec int().
La règle « vide est faux » a aussi un usage pratique : repérer quelqu'un qui a appuyé sur Entrée sans rien taper :
name = input("Name: ").strip()
print("Name was given:", bool(name))Name:
Name was given: FalseUn exemple complet
eligibility.py :
# Check a discount rule without deciding anything yet
age = int(input("Age : "))
years_member = int(input("Years a member : "))
order_total = float(input("Order total : "))
is_adult = age >= 18
is_senior = age >= 60
is_loyal = years_member >= 2
is_large_order = order_total >= 1000
# The rule: adults who are either long-standing members or spending a lot
gets_discount = is_adult and (is_loyal or is_large_order)
print()
print(f"Adult : {is_adult}")
print(f"Senior : {is_senior}")
print(f"Loyal member : {is_loyal}")
print(f"Large order : {is_large_order}")
print(f"Gets discount : {gets_discount}")Age : 34
Years a member : 1
Order total : 1500
Adult : True
Senior : False
Loyal member : False
Large order : True
Gets discount : TrueRemarquez que chaque condition a reçu son propre nom d'abord, puis que la règle a été assemblée à partir de ces noms. Écrite sur une seule ligne — age >= 18 and (years_member >= 2 or order_total >= 1000) — le code fonctionnerait exactement de la même façon, mais le relire six mois plus tard pour retrouver la règle serait laborieux. Les parenthèses comptent aussi : sans elles, and serait évalué en premier et la règle elle-même changerait.
En cas de problème
SyntaxError: invalid syntax. Maybe you meant '==' ... Un = a été écrit là où une comparaison était attendue. Utilisez ==.
Ces valeurs devraient être égales, mais j'obtiens False Vérifiez trois choses : les espaces en trop (.strip()), la casse des lettres (.lower()), et le type — "22" == 22 est toujours False, car un texte et un nombre ne sont jamais égaux.
TypeError: '<' not supported between instances of 'str' and 'int' Vous avez comparé du texte à un nombre, probablement en oubliant de convertir une valeur venant de input(). Enveloppez-la dans int().
Deux décimaux ne sont pas égaux avec == C'est attendu — rappelez-vous le piège des décimaux du chapitre 5. Comparez après round().
La condition ne fait pas ce qu'elle dit Vérifiez l'ordre de and/or : not d'abord, puis and, puis or. Utilisez des parenthèses pour exprimer explicitement votre intention.
Étape 4 sur 6 — Prédire
Vérifiez votre compréhension
Quel est le résultat de ces trois lignes ?
print(5 > 3 and 2 > 4)
print(5 > 3 or 2 > 4)
print(not 5 > 3)- AFalse True True
- BFalse False True
- CTrue True False
- DFalse True False
Comment chacune de ces trois valeurs est-elle considérée : vraie ou fausse ?
print(bool("False"))
print(bool(""))
print(bool(0))- ATrue False False
- BTrue True False
- CFalse True False
- DFalse False False
La personne a tapé Yes (Y majuscule, un espace à la fin) et le programme affiche Continuing: False. Pourquoi, et quelle est la meilleure correction ?
answer = input("Type yes to continue: ")
print("Continuing:", answer == "yes")- A`answer` doit d'abord être converti avec `bool()`
- BLe `==` devrait être un simple `=`
- CDans une comparaison, l'espace final et la majuscule comptent tous les deux — il faut `answer.strip().lower() == "yes"`
- DUne valeur venant de `input()` ne peut jamais être égale à `"yes"`, il faut donc utiliser `in` à la place
Répondre nécessite un compte
Connectez-vous pour vérifier vos réponses
Les questions sont ci-dessus, et les résoudre de tête est ce qui compte vraiment. Connectez-vous pour voir les réponses, les explications et les indices à trois niveaux.
À vous de jouer
Écrivez un fichier appelé password_check.py qui reçoit un mot de passe et affiche True/False pour quatre questions :
- La longueur est d'au moins 8 caractères
- La longueur est comprise entre 8 et 20 (écrivez-le sous forme de comparaison enchaînée)
- Le mot
"password"n'apparaît pas dedans (vous aurez besoin denotet dein, et il faut mettre en minuscules avant de comparer) - Les trois conditions ci-dessus sont vraies en même temps
Exécutez-le ensuite avec au moins quatre mots de passe différents : un très court, un très long, un contenant Password avec une majuscule, et un qui remplit toutes les conditions. Vérifiez que les quatre réponses sont correctes — surtout la troisième, car c'est là que se cache le piège de la casse.
Cette mission va plus loin
Ce que vous avez lu ci-dessus est la mission complète — rien n’en a été retiré. Pro ajoute :
- Ce qui se passe vraiment en coulisses : comment Python exécute ce code
- La solution complète de l’exercice, expliquée étape par étape
- Des exercices supplémentaires plus difficiles
- La question d’entretien sur ce sujet, avec une réponse modèle
Étape 6 sur 6
Défi — le quiz du chapitre
Dix questions, de la plus facile à la plus difficile. Les dernières sont difficiles exprès.
Connectez-vous pour faire le quiz