Opérateurs de comparaison
Testez l'égalité, l'inégalité et l'ordre, et enchaînez les comparaisons dans une seule expression.
- Utiliser ==, !=, <, <=, >, >= pour comparer des valeurs
- Enchaîner des comparaisons comme 0 <= x < 10
- Comprendre en quoi == diffère de is
- Comparer des valeurs de types différents
L’ordinateur, mis en demeure de trancher
Une évaluation 2 + 3 produit un nombre. Mais la plus grande partie de ce qu’un programme a besoin de savoir n’est pas un nombre, c’est une décision. La note valide-t-elle ? Le nom d’utilisateur est-il pris ? La température est-elle dans la plage ? Les opérateurs de comparaison sont la branche de la famille arithmétique qui produit une réponse dans l’ensemble au lieu de .
Les six opérateurs de comparaison
Chacun compare deux valeurs et produit un bool :
5 == 5 # True — égal
5 != 3 # True — différent
5 < 10 # True — inférieur à
5 <= 5 # True — inférieur ou égal
5 > 10 # False — supérieur à
5 >= 5 # True — supérieur ou égalEn mathématiques vous écririez , , ; Python opte pour les <=, >=, != compatibles avec un clavier. Le sens est inchangé. Le double égal == exige une pause délibérée : c’est la question « sont-ils égaux ? », tandis qu’un seul = est un ordre d’affectation. Le signe doublé est ce qui les empêche de jamais entrer en collision.
Enchaînez les comparaisons comme un mathématicien
Supposons que appartienne à l’intervalle . Sur papier vous écrivez la condition en trois parties d’un seul souffle, . Python vous laisse l’écrire exactement ainsi :
x = 5
0 <= x < 10 # True — les deux conditions tiennent
0 <= x < 3 # False — la seconde échoueC’est une expression unique, évaluée par le même appariement que vous liriez : puis , la valeur du milieu n’étant calculée qu’une fois. La comparaison enchaînée vaut and , mais la forme enchaînée se lit comme les mathématiques dont elle sort.
== interroge le contenu ; is interroge l’identité
Deux questions se ressemblent et répondent différemment :
a = [1, 2, 3]
b = [1, 2, 3]
a == b # True — même contenu
a is b # False — objets distincts en mémoire
c = a
a is c # True — le même objet== compare les valeurs portées ; is compare les adresses mémoire. Plusieurs boîtes peuvent par hasard contenir la même liste ; il n’y a qu’un seul objet. Les deux coïncident pour les petites choses (comme les petits entiers que Python met en cache) et divergent pour tout le reste, donc la règle est stable : utilisez == pour le contenu, et réservez is au singleton unique qui n’a pas de contenu à comparer, None :
if x is None: # correct
if x == None: # fonctionne, mais vous posez la mauvaise questionComparer entre types
Amener des valeurs d’ensembles différents dans une comparaison, contre , suit une politique fixe :
5 == 5.0 # True — l'égalité numérique ignore le type
"5" == 5 # False — une chaîne et un int ne sont jamais égaux
"5" < 6 # TypeError: '<' not supported between str and intDeux règles en découlent. Pour l’égalité, les valeurs numériques se comparent par la valeur, pas par le type, tandis que des valeurs de familles étrangères ne sont simplement jamais égales. Pour l’ordre, Python refuse de deviner : il n’existe pas d’ordre total qui ait un sens entre une chaîne et un entier, donc il lève TypeError plutôt que d’en inventer un.
Un exemple travaillé : la tolérance du reçu
Le piège du bruit de floats a une réponse constructive. Comparez avec tolérance comme le ferait un physicien, ou passez à des unités entières exactes :
expected = 0.3
price = 0.1 + 0.2 # 0.30000000000000004
price == expected # False — bruit du float
abs(price - expected) < 1e-9 # True — dans la toléranceLe motif est une paire de questions et une décision : sont-ils exactement égaux ? False. Et dans une proximité raisonnable ? True. La seconde est celle que le monde réel entend souvent.
Pièges courants
=contre==.if score = 60:est une erreur de syntaxe, Python ne vous laisse pas affecter dans une condition par accident. Le signe doublé est un garde-fou, pas une formalité.- Égalité en virgule flottante.
0.1 + 0.2 == 0.3estFalse. La représentation binaire de est infinie, donc la somme tombe sur . Comparez dans une tolérance à la place :abs((0.1 + 0.2) - 0.3) < 1e-10. ==avecNone.x == Nonemarche par hasard ;x is Noneest la question que vous posez vraiment.- L’égalité de floats demande une tolérance ; l’argent demande des unités entières.
0.1 + 0.2 == 0.3échoue (False), alors comparez dansabs(a - b) < 1e-9ou comptez en centimes,120 == 12 * 10est exact.
🧩 Défis
🧩 Défi, réfléchissez d'abord, puis révélez
Prédisez chaque résultat sans exécuter : 5 == 5.0, "5" == 5, 5 < "6".
💡 Réponse : 5 == 5.0 → True (égalité numérique entre types), "5" == 5 → False (une chaîne n'est jamais égale à un int), 5 < "6" → TypeError (l'ordre n'est pas défini entre int et str en Python 3).
🧩 Défi, réfléchissez d'abord, puis révélez
Écrivez une seule comparaison enchaînée qui vérifie qu’un nombre est dans , sans and.
💡 Réponse : 1 <= n <= 100, la forme enchaînée se lit exactement comme l'intervalle $1 \leq n \leq 100$.
🧩 Défi, réfléchissez d'abord, puis révélez
Pourquoi 0.1 + 0.2 == 0.3 renvoie-t-il False ? Comment écrirez-vous un test d’égalité en virgule flottante correct ?
💡 Réponse : Ni $0.1$ ni $0.2$ n'ont de représentation binaire exacte, donc leur somme vaut $0.30000000000000004$, pas exactement $0.3$. Testez dans une tolérance : abs((0.1 + 0.2) - 0.3) < 1e-10.
🤔 Questions socratiques
- Si
a == bestTrue,a is bdoit-il l’être aussi ? Dans quelles circonstances deux objets peuvent-ils être égaux en contenu et distincts en identité ? - Pourquoi Python interdit-il
5 < "6"tout en laissant5 == "5"êtreFalse? Quel principe de conception rend les deux comportements cohérents ? - Quand
isest-il vraiment le bon outil pour l’égalité ? Pensez au singletonNone, et pourquoi comparer son contenu n’a pas de sens.
✅ Vérification rapide
1. Que vaut 5 == 5.0 ?
2. Que vaut 0 <= 5 < 10 ?
3. Quelle est la façon pythonique de vérifier si x est None ?