运算符优先级 —— Python教程

2,750 阅读3分钟

本节教程将讲解 Python 运算符的优先级和关联性,在这之前你应该理解了 Python 运算符

对于表达式,Python 解释器将处理优先级更高的运算符,并且除了指数运算符(**)外,几乎所有运算符的处理方式都从左到右执行。

运算符优先级

工作方式

当我们将值、变量、运算符和函数调用放在一起时,就会形成表达式。当表达式执行完后,Python 解释器就会把它认为是有效的表达式。

像这样:

>>> 3 + 4
7

3 + 4 是一个表达式,它包含一个运算符和两个操作数。所以,一个复杂的语句可以包含多个运算符。为了执行复杂的表达式,Python 需要列出运算符的优先级,就是要控制程序操作的顺序。

优先级列表

下面是一个复合表达式包含多个运算符的例子:

# 先做乘法再做加法结果就是 17
5 + 4 * 3

也可以使用括号 () 更改操作顺序,括号比算数运算符优先级更高:

# 先做括号内加法再做乘法结果是 27
(5 + 4) * 3

下面用表格列出运算符从高到低的优先级:

运算符 用法
{ } 括号(分组)
f(args...) 函数调用
x[index:index] 切片
x[index] 索引值
x.attribute 属性
** 指数
~x 取反
+x,-x 正、负值
*、/、% 乘、除、求余
+、- 加、减
<<、>> 左移、右移
& 按位 AND
^ 按位 XOR
| 按位 OR
is、not、in、is、is not、< 、<=、>、>=、<>、!=、== 比较、算数、身份
not x 布尔 NOT
and 布尔 AND
or 布尔 OR
lambda lambda 表达式

关联运算符

上表每组可以有多个运算符,这意味着此组运算符的优先级都相同。所以当多个运算符有相同优先级时,它们之间的关联性就决定了最后的执行顺序。

处理关联性

当有多个相同优先级运算符一同处理时,除指数(**)外,Python 都将按照从左到右的顺序依次执行。

举个例子:

# 具有相同优先级,从左到右执行结果为 1
print(4 * 7 % 3)

# 括号有更高优先级,执行结果为 0
print(2 * (10 % 5))

提到过其中指数(**)运算符不同,它是按照从右向左顺序执行:

# 从右到左执行结果为 256
print(4 ** 2 ** 2)

# 括号有更高优先级,但是执行结果还会为 256
print((4 ** 2) ** 2)

非关联运算符

Python 中其实还有一些不支持关联性的运算符,例如赋值运算符和比较运算符。所以针对这些非关联运算符有特殊的规则,这就需要我们特别记忆。

例如表达式 5 < 7 < 9 不能理解成 (5 < 7) < 95 < (7 < 9),而是应该看成 5 < 7 and 7 < 9 且从左到右求值。

还有对语法的支持,像 a = b = c 这样的赋值运算符是可执行的,但是像 a = b += c 就会出现错误。

x = 11, y = 12, z = 13

# 不正确的表达式
# 非关联运算符
# 错误 -> SyntaxError: invalid syntax
x = y += 12

(完)