本节教程将讲解 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) < 9 或 5 < (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
(完)