Les opérateurs en Python : calculer, comparer, combiner

Un opérateur transforme une ou deux valeurs en un résultat : addition, comparaison, affectation. Les cinq familles de Python, leur priorité et leurs pièges.
5 min de lecture
Believemy logo

Définition

Écrire un programme, c'est résoudre sans arrêt de petits problèmes : additionner deux nombres, vérifier un seuil, décider si deux conditions sont vraies à la fois. Un opérateur répond à ce besoin : il prend une ou deux valeurs, agit dessus, et rend un résultat. Le + additionne, le > compare, le = range.

Ces symboles sont les briques les plus élémentaires du langage : toute expression se ramène à une suite d'opérateurs appliqués à des valeurs. Voici trois familles réunies dans un seul exemple.

PYTHON
total = 12 + 8                 # arithmétique
assez = total >= 20            # comparaison
valide = assez and total < 100 # logique

Les valeurs sur lesquelles il travaille s'appellent des opérandes. Point qui surprend souvent au début : un opérateur ne les modifie presque jamais, il fabrique une valeur neuve, qui disparaît aussitôt si elle n'est rangée nulle part, par exemple dans une variable.


Les cinq familles

Python compte une quarantaine d'opérateurs, impossible à mémoriser un par un. Ce qui compte n'est pas leur écriture, mais ce qu'ils rendent une fois l'action terminée : cinq familles suffisent à tout couvrir.

FamilleÉcritureRésultat produit
Arithmétiques+ - * / // % **Un nombre
Comparaison== != < > <= >=Un bool
Logiquesand, or, notUn booléen, ou l'un des opérandes
Appartenance et identitéin, isVrai ou faux
Affectation= += -= *= //=Rien, ils rangent une valeur

Retenir un opérateur par son résultat évite la confusion la plus fréquente au début : croire que tout symbole se combine librement. Une comparaison rend un booléen, elle a sa place dans une condition ; une affectation ne rend rien, et Python refuse de l'y placer.


La priorité change le résultat

Tant qu'une expression ne contient qu'un seul opérateur, il n'y a rien à trancher. Les ennuis commencent dès qu'on en mélange plusieurs : Python doit décider dans quel ordre les appliquer, et cet ordre change parfois le résultat. La règle ressemble à celle apprise en mathématiques : puissance avant multiplication, multiplication avant addition, comparaison avant opérateurs logiques, et parmi ces derniers not avant and, lui-même avant or.

Deux exemples le montrent, le second nettement plus lourd de conséquences que le premier.

PYTHON
2 + 3 * 4
# 14, et non 20

age > 18 and pays == "FR" or admin
# lu comme : (age > 18 and pays == "FR") or admin
Attention

La seconde ligne est un bug de production en puissance : un compte administrateur franchit la porte quel que soit son âge, parce que le or final rattrape tout ce qui précède. La parenthèse ne coûte rien et vaut toujours mieux que la mémoire du tableau de priorités, même quand elle est techniquement superflue.


Quatre pièges à connaître

Le premier tient à un seul signe. = range une valeur, == compare deux valeurs. Les confondre ne rend pas un résultat faux : Python refuse d'exécuter la ligne et lève une erreur de syntaxe, repérable avant même que le programme ne tourne. Affecter en pleine expression reste possible, sous l'écriture distincte de l'opérateur walrus.

Le deuxième concerne la division : deux entiers qui se divisent parfaitement rendent-ils un entier ? Non, / renvoie toujours un float : 10 / 2 vaut 5.0, pas 5. Un entier demande //, qui tronque la partie décimale. Diviser par zéro ne donne aucun infini : Python lève une ZeroDivisionError, qui arrête le programme si personne ne l'intercepte.

Le troisième vient du +, qui change de sens selon ce qu'on lui donne : il additionne, met bout à bout deux chaînes, assemble deux listes. Mélanger les genres, un nombre et une chaîne par exemple, lève une TypeError, la panne la plus courante sur une saisie utilisateur qui arrive toujours en texte.

Le quatrième oppose == et is, le plus difficile à repérer, car les deux répondent souvent pareil sans l'être. Le premier demande si deux valeurs sont égales, le second si elles désignent le même objet en mémoire. Python réutilise parfois le même objet sur de petits nombres ; sur des listes ou de grands nombres, ils divergent. En pratique, is ne sert qu'à comparer à None.


Questions fréquentes

Question

À quoi sert l'opérateur pourcent ?

Le symbole % donne le reste d'une division entière : 17 % 5 vaut 2, car 5 entre trois fois dans 17 avec deux de reste. Son usage le plus courant reste le test de divisibilité, avec nombre % 2 == 0 pour reconnaître un nombre pair, ou i % 10 == 0 pour déclencher une action une fois sur dix dans une boucle.

Question

Peut-on enchaîner deux comparaisons ?

Oui, et c'est une particularité de Python : 0 < note <= 20 s'écrit d'un seul tenant et se lit comme en mathématiques. La plupart des langages imposent ici deux comparaisons séparées, reliées par un and, une écriture plus longue et moins lisible.

Question

Pourquoi and et or ne renvoient-ils pas toujours vrai ou faux ?

Parce qu'ils renvoient l'opérande qui a tranché plutôt qu'un booléen : "" or "défaut" vaut la chaîne "défaut", pas True. Ils s'arrêtent dès que le résultat est acquis, ce qui permet de vérifier qu'une valeur existe avant l'accès qui échouerait sur elle. Ces raccourcis font gagner des lignes une fois acquis, et notre formation Python les met en pratique au fil des exercices.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.