本节教程将讲解 Python 运算符的优先级和关联性,在这以前你应该理解了 Python 运算符。python
对于表达式,Python 解释器将处理优先级更高的运算符,而且除了指数运算符(**)外,几乎全部运算符的处理方式都从左到右执行。函数
当咱们将值、变量、运算符和函数调用放在一块儿时,就会造成表达式。当表达式执行完后,Python 解释器就会把它认为是有效的表达式。post
像这样:spa
>>> 3 + 4
7
复制代码
3 + 4 是一个表达式,它包含一个运算符和两个操做数。因此,一个复杂的语句能够包含多个运算符。为了执行复杂的表达式,Python 须要列出运算符的优先级,就是要控制程序操做的顺序。code
下面是一个复合表达式包含多个运算符的例子:教程
# 先作乘法再作加法结果就是 17
5 + 4 * 3
复制代码
也能够使用括号 ()
更改操做顺序,括号比算数运算符优先级更高:索引
# 先作括号内加法再作乘法结果是 27
(5 + 4) * 3
复制代码
下面用表格列出运算符从高到低的优先级:get
运算符 | 用法 |
---|---|
{ } | 括号(分组) |
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 表达式 |
上表每组能够有多个运算符,这意味着此组运算符的优先级都相同。因此当多个运算符有相同优先级时,它们之间的关联性就决定了最后的执行顺序。table
当有多个相同优先级运算符一同处理时,除指数(**)外,Python 都将按照从左到右的顺序依次执行。class
举个例子:
# 具备相同优先级,从左到右执行结果为 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
复制代码
(完)