Cours de Python / Comparer des valeurs et combiner des conditions

Les opérateurs de comparaison testent la relation entre deux valeurs ; les opérateurs logiques combinent des conditions. En Python, and et or peuvent renvoyer une valeur autre qu’un booléen : il faut distinguer le test d’une condition du choix d’une valeur par défaut.

Distinguer comparaison, affectation et identité

amount = 8000 affecte une valeur à une variable, tandis que amount == 8000 vérifie son égalité avec cette valeur. != signifie « différent de » ; <, <=, > et >= comparent les grandeurs. Une expression comme 0 < amount <= 10000 exige un montant strictement positif, inférieur ou égal à 10 000. Le zéro est exclu ; 10 000 est inclus.

Une comparaison chaînée évalue son expression centrale une seule fois. Si le premier test échoue, le dernier opérande n’est pas évalué. Avant de comparer une saisie utilisateur à un seuil numérique, vérifiez puis convertissez cette saisie : "8000" > 5000 provoque une TypeError, car une chaîne et un entier ne sont pas ordonnés ainsi.

None représente notamment l’absence de valeur. Utilisez value is None pour la détecter. is teste si deux références désignent le même objet, alors que == compare leurs valeurs. Deux listes créées séparément peuvent donc être égales sans être le même objet, comme le montre la dernière ligne du programme.

Exécuter un programme de conditions complet

Python 3 et sa bibliothèque standard suffisent. Dans un dossier d’exercice, enregistrez le programme complet ci-dessous dans conditions.py, au format UTF-8. Ouvrez un terminal dans ce dossier, avec l’environnement virtuel du projet activé, puis lancez python conditions.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 conditions.py si python3 est le nom de votre interpréteur.

amount = 8000
category = "food"
print(0 < amount <= 10000)
print(amount > 5000 and category == "food")
print(not category)
print("" or "unknown")
print(0 or 100)
print([] == [], [] is [])

Le résultat attendu est le suivant :

True
True
False
unknown
100
True False

Les deux premières lignes valident respectivement l’intervalle du montant et l’association « montant supérieur à 5 000 et catégorie food ». La troisième vaut False, car category est une chaîne non vide. Les deux suivantes affichent les opérandes de remplacement, unknown et 100. Enfin, les deux listes vides ont le même contenu mais des identités distinctes : True False.

Comprendre la valeur de vérité et le court-circuit

Dans une condition, None, False, les nombres nuls et les conteneurs vides sont considérés comme faux. Une chaîne non vide est vraie, même si son contenu est "False" ou "0". Ainsi, bool("False") vaut True : pour lire une option textuelle, définissez explicitement les chaînes acceptées et rejetez les autres valeurs plutôt que de les passer directement à bool().

Expression Valeur renvoyée Évaluation de droite
x and y x si x est faux, sinon y Uniquement si x est vrai
x or y x si x est vrai, sinon y Uniquement si x est faux
not x Un booléen inversant la valeur de vérité de x Aucun second opérande

Ce mécanisme est l’évaluation en court-circuit. Dans False and check() et True or check(), check() n’est jamais appelée. Pour l’observer sans dépendance supplémentaire, exécutez print(False and print("called")) dans l’interpréteur : seule la ligne False apparaît, jamais called. Ne placez pas une validation ou un enregistrement obligatoire dans un opérande dont l’exécution peut être évitée.

Les comparaisons sont prioritaires sur les opérations logiques ; parmi celles-ci, not est prioritaire sur and, lui-même prioritaire sur or. Pour combiner plusieurs règles métier, des parenthèses explicites facilitent la lecture. Les règles détaillées figurent dans la documentation Python sur les valeurs de vérité, les opérations booléennes et les comparaisons.

Conserver les zéros et vérifier les limites

amount or 100 choisit 100 lorsque amount vaut zéro. Si un montant nul est valide et que seule l’absence de valeur doit déclencher le remplacement, utilisez 100 if amount is None else amount. Cette expression renvoie 100 pour None, mais conserve zéro. Le même piège concerne une chaîne ou une liste vide qui aurait un sens dans vos données.

  1. Remplacez uniquement amount = 8000 par amount = 10000, puis relancez le fichier : les deux premières lignes restent True. Avec 10001, la première devient False tandis que la seconde reste True, car elle ne teste pas la limite supérieure.
  2. Rétablissez 8000, puis remplacez uniquement category = "food" par category = "". La deuxième ligne devient False et la troisième True. Rétablissez ensuite "food".
  3. Testez le montant zéro : les deux premières lignes deviennent False. La ligne print(0 or 100) reste 100, car elle contient un zéro littéral et ne lit pas la variable amount. Comparez séparément les expressions de défaut avec zéro et avec None, puis restaurez 8000 dans le fichier.

Après restauration des deux affectations, le programme doit retrouver exactement les six lignes initiales. Vérifiez les limites, les valeurs vides et les champs absents avant de réutiliser une expression logique dans une règle de décision : une condition correcte pour un montant positif ne définit pas à elle seule le traitement de ces cas.