Python 中的运算符优先级和结合性

2024 年 8 月 29 日 | 5 分钟阅读

在本教程中,我们将了解 Python 运算符的优先级和结合性。理解 Python 运算符的工作原理对于开发人员至关重要。

读者最好在检查完 Python 如何评估其运算符顺序后,理解其机制。有些运算符的优先级高于其他运算符;例如,除法运算符的优先级高于乘法运算符;因此,除法先执行。

在给定的任何逻辑或算术表达式中,Python 解释器会先执行优先级较高的运算符。除了指数运算符(**)之外,所有其他运算符都从左到右执行。

Python 运算符优先级

表达式是由数字、变量、运算符以及内置或用户定义的函数调用组成的集合。Python 解释器可以求值一个有效的表达式。

代码

输出

-5

这里以表达式 2 - 7 为例。在表达式中,我们可以添加多个运算符。Python 中有一个优先级原则来求值这类表达式。它指导着任务完成的顺序。

例如,除法比加法优先级高。

代码

输出

24.0

然而,我们可以通过使用括号 () 来反转这个顺序,括号的优先级高于除法。

代码

输出

16.0

下表显示了 Python 运算符的优先级。它是按降序排列的(上面的运算符比下面的运算符具有更高的优先级)。

运算符含义
()括号
**指数
+x, -x, ~x一元加、一元减、按位非
*, /, //, %乘法、除法、整除、取模
+, -加法、减法
<<, >>按位移位运算符
&按位与
^按位异或
|按位或
==, !=, >, >=, <, <=, is, is not, in, not in比较、身份、成员运算符
not逻辑非
并且逻辑与
逻辑或

考虑以下示例

假设我们正在构建一个 if...else 块,只有当颜色是红色或绿色且数量大于或等于 5 时才会执行。

代码

输出

Your parcel is dispatched

即使数量为 0,此程序也会运行 if 块。因为 and 的优先级高于 or,所以结果不符合预期。

通过适当使用括号 (),我们可以得到所需的结果。

代码

输出

Your parcel cannot be dispatched

Python 运算符结合性

我们可以从上面的列表中看到,某个类别中包含许多运算符。这些运算符的顺序是相同的。

当两个运算符具有相同的优先级时,结合性有助于确定操作的顺序。

具有多个具有相同优先级的运算符的给定表达式的求值方向就是结合性。几乎所有运算符都是从左到右结合的。

代码

输出

12
12

注意:在 Python 中,指数运算 ** 具有从右到左的结合性。

代码

输出

6561
729

非结合性运算符

在 Python 中,一些运算符(如比较运算符或赋值运算符)没有这样的结合性规则。这类运算符的模式有其自身的规则,无法用结合性来表示。例如,a < b < c 不等同于 (a < b) < c 或 a < (b < c)。a < b < c 是从左到右求值的,等同于 a < b and b < c。

此外,在链接赋值运算符(如 a = b = c = 3)时是完全可以接受的,但 a = b = c += 2 是不可接受的。

代码

输出

a = b = c += 2
              ^
SyntaxError: invalid syntax

因此,此运算符不遵循从左到右的结合性。

下表显示了各种 Python 运算符的结合性。

运算符描述结合性
( )括号从左到右
**指数从右到左
* / %乘法 / 除法 / 取模从左到右
+ -加法 / 减法从左到右
<< >>按位左移 / 按位右移从左到右
< <=
> >=
关系运算符:小于 / 小于等于 / 大于 / 大于等于从左到右
== !=关系运算符:等于 / 不等于从左到右
is, is not

in, not in
身份运算符

成员运算符
从左到右
&按位 AND 运算符从左到右
^按位异或运算符从左到右
|按位或运算符从左到右
not逻辑非从右到左
并且逻辑与从左到右
逻辑或从左到右
=
+= -=
*= /=
%= &=
^= |=
<<= >>=
赋值运算符
加法 / 减法
乘法 / 除法
取模 / 按位 AND
按位异或 / 或
按位左移 / 右移
从右到左

在 Python 中,我们如何保留运算符优先级?

你是否听说过算术中的 BODMAS 规则?

答案无疑是肯定的!

BODMAS 是括号、顺序、除法、乘法、加法和减法的缩写。当方程中存在各种算术运算时,此规则指定了它们应计算的顺序。

如果我们查看上面给出的优先级图表,我们会注意到运算符的顺序如下:

括号 - 指数 - 乘法 - 除法 - 加法 - 减法

PEMDAS 是此规则的缩写,它与 BODMAS 类似。

结论

在本教程中,我们学习了:

优先级规则决定了方程中各种运算符的执行顺序。

结合性规则决定了方程中多个相同级别或具有相同优先级的运算符如何使用的顺序。