HOWTO · Python
Ordre des opérations en Python
Ce tutoriel traite de l'ordre d'exécution des opérateurs en Python, couvrant la priorité des opérateurs, les opérateurs arithmétiques, les opérateurs logiques et l'utilisation des parenthèses pour plus de clarté. Acquérez une compréhension solide de la façon dont Python évalue les expressions pour écrire un meilleur code et éviter les pièges courants.
Sur cette page
Python évalue les opérateurs selon leur priorité, de sorte que la multiplication et la division lient plus fortement que l’addition et la soustraction. Pour prédire un résultat, regroupez l’expression par priorité, puis tenez compte de l’associativité et des éventuels opérateurs logiques à court-circuit. Les parenthèses rendent le regroupement souhaité explicite.
Qu’est-ce que la priorité des opérateurs ?
La priorité des opérateurs est la priorité que Python utilise pour regrouper les parties d’une expression. Elle décrit le regroupement, et non un ordre d’exécution universel de gauche à droite : l’associativité détermine la façon dont les opérateurs de même priorité se regroupent, et Python évalue les opérandes dans leur ordre spécifié. Par exemple, 3 + 4 * 2 se regroupe en 3 + (4 * 2) et a pour valeur 11.
La référence suivante énumère les opérateurs Python courants, de la priorité la plus élevée à la plus faible. Les opérateurs sur la même ligne partagent un niveau de priorité ; utilisez les règles d’associativité ou les parenthèses pour déterminer leur regroupement.
| Priorité, de la plus élevée à la plus faible | Opérateurs ou expressions |
|---|---|
| Regroupement et accès | (expressions), x[index], x(...), x.attribute |
| Await | await x |
| Exponentiation | ** |
| Numériques et bit à bit unaires | +x, -x, ~x |
| Multiplication | *, @, /, //, % |
| Addition | +, - |
| Décalages | <<, >> |
| ET bit à bit | & |
| XOR bit à bit | ^ |
| OU bit à bit | ` |
| Comparaisons et tests d’appartenance/d’identité | <, <=, >, >=, !=, ==, in, not in, is, is not |
| NOT booléen | not x |
| AND booléen | and |
| OR booléen | or |
| Expression conditionnelle | x if condition else y |
| Lambda | lambda |
| Expression d’affectation | := |
Ceci est une référence pratique pour les opérateurs abordés ici, et non une grammaire complète de toutes les formes d’expressions. PEMDAS est un moyen mnémotechnique arithmétique familier, mais il ne décrit pas tous les opérateurs Python et ne remplace pas les règles de priorité ci-dessus. L’exponentiation se regroupe également de droite à gauche, donc 2 ** 3 ** 2 signifie 2 ** (3 ** 2). Les signes unaires et l’exponentiation ont une relation particulière : -2 ** 2 se regroupe en -(2 ** 2).
Opérateurs arithmétiques de base
En arithmétique, les parenthèses se regroupent en premier ; vient ensuite l’exponentiation ; puis la multiplication, la division, la division entière et le modulo ; enfin l’addition et la soustraction. La multiplication et la division ont la même priorité et s’associent de gauche à droite, tout comme l’addition et la soustraction. L’opérateur / effectue une division réelle, donc diviser des entiers peut produire un nombre à virgule flottante.
Exécutez cet exemple :
a = 10
b = 5
c = 2
mixed = a + b * c - a / b
explicit = (a + b) * c - a / b
print(mixed)
print(explicit)
La première expression se regroupe en 10 + (5 * 2) - (10 / 5) ; la seconde se regroupe en (10 + 5) * 2 - (10 / 5). Les divisions produisent des valeurs à virgule flottante, donc les valeurs finales sont des nombres flottants. Cet exemple n’a pas été exécuté, donc sa sortie n’est pas montrée ici.
Les mêmes règles expliquent 10 + 2 / 2 : la division est regroupée en premier, donc la valeur est 11. Python ne choisit pas l’addition en premier simplement parce qu’elle apparaît en premier dans l’expression.
Utiliser les parenthèses pour plus de clarté
Les parenthèses établissent le regroupement et peuvent modifier un résultat. Dans l’exemple ci-dessus, (a + b) est regroupé avant la multiplication, ce qui modifie l’arithmétique par rapport à l’expression sans parenthèses. Ajoutez des parenthèses lorsqu’elles clarifient le calcul que vous souhaitez, même lorsque la priorité par défaut de Python produirait déjà le même regroupement.
Les parenthèses contrôlent le regroupement ; elles ne signifient pas que chaque partie de l’expression est évaluée avec empressement. Python suit toujours la sémantique de chaque opérateur, y compris le comportement de court-circuit de and et or.
Opérateurs de comparaison et logiques
Les comparaisons telles que ==, !=, <, <=, > et >= ont une priorité plus élevée que not, and et or. Les parenthèses aident à montrer quelles comparaisons alimentent une expression logique. Par exemple, (10 > 5) and (15 > 10) combine deux comparaisons vraies, donc l’expression est vraie.
not s’applique à l’expression qui le suit et lie plus fortement que and ; and lie plus fortement que or. and et or ont tous deux un comportement de court-circuit : Python peut sauter l’évaluation de l’opérande droit lorsque l’opérande gauche détermine le résultat. Ils renvoient également l’un de leurs opérandes, plutôt que de toujours renvoyer un booléen. Dans une condition, Python traite la valeur résultante selon sa valeur de vérité.
Pour une condition lisible, écrivez des regroupements explicites tels que (age >= 18) and (has_ticket or is_guest). Cela rend la relation souhaitée claire et aide à éviter qu’une règle de priorité soit confondue avec la règle métier.
Enchaîner les comparaisons
Python prend en charge les chaînes de comparaisons telles que 10 > 5 > 15. Cela équivaut en résultat à 10 > 5 and 5 > 15, l’expression du milieu n’étant évaluée qu’une seule fois. La première comparaison est vraie et la seconde est fausse, donc l’ensemble de la chaîne est faux. Python ne compare pas le résultat booléen de 10 > 5 avec 15.
Une chaîne est utile pour les vérifications d’intervalle : 0 <= score <= 100 exige que les deux comparaisons soient vraies. Si les comparaisons portent sur des expressions différentes ou si la valeur du milieu doit être évaluée plus d’une fois, écrivez les comparaisons souhaitées explicitement et utilisez une variable temporaire lorsque cela améliore la clarté.
Conclusion
Pour prédire une expression Python, appliquez les règles de priorité des opérateurs, vérifiez l’associativité lorsque les opérateurs partagent un niveau, et tenez compte de comportements tels que le court-circuit. Utilisez les parenthèses pour communiquer le regroupement que vous souhaitez. Ces habitudes rendent les expressions arithmétiques et conditionnelles plus faciles à lire et à déboguer.
FAQ
-
Qu’est-ce que la priorité des opérateurs en Python ?
C’est la priorité que Python utilise pour regrouper les opérateurs dans une expression. L’associativité et la sémantique de chaque opérateur influent également sur la façon dont l’expression est évaluée.
-
Comment puis-je modifier le regroupement d’une expression ?
Mettez des parenthèses autour de la sous-expression qui doit être regroupée en premier, comme
(a + b) * c. -
Que se passe-t-il lorsque les opérateurs ont la même priorité ?
Cela dépend de l’opérateur. La plupart des opérateurs se regroupent de gauche à droite, l’exponentiation se regroupe de droite à gauche, et les comparaisons peuvent former une chaîne. Ajoutez des parenthèses lorsque le regroupement pourrait ne pas être clair.
-
Que se passe-t-il si j’omets les parenthèses dans une expression complexe ?
Python applique ses règles de priorité et d’associativité définies. Si ce regroupement est difficile à voir, ajoutez des parenthèses pour rendre le calcul souhaité clair.
-
Puis-je enchaîner les opérateurs de comparaison ?
Oui. Une chaîne telle que
0 <= score <= 100vérifie les deux comparaisons et évalue l’expression du milieu une seule fois.