Python运算符优先级详解与实例
在学习数学的时候,我们都接触过运算顺序的概念,例如 BODMAS 法则(括号、指数、除法、乘法、加法、减法),它告诉我们在一个包含多种运算符的数学表达式中,应该先算什么,后算什么。
Python 中也有类似的概念,它定义了运算符的优先级。当一个表达式包含多个运算符时,优先级高的运算符会先被计算。理解运算符优先级对于编写正确、可预测的代码至关重要。
下面这张表列出了 Python 中所有运算符的优先级,从高到低排列。 同一行的运算符具有相同的优先级, 此时,表达式会按照从左到右的顺序计算。
运算符 | 描述 |
---|---|
(expressions...) , [expressions...] , {key: value...} , {expressions...} | 圆括号、方括号、字典、集合(分组) |
x[index] , x[index:index] , x(arguments...) , x.attribute | 索引、切片、调用、属性引用 |
** | 幂运算 |
+x , -x , ~x | 一元正号、一元负号、按位取反 (NOT ) |
* , @ , / , // , % | 乘法、矩阵乘法、除法、整除、取余 |
+ , - | 加法、减法 |
<< , >> | 移位 |
& | 按位与 (AND ) |
^ | 按位异或 (XOR ) |
| | 按位或 (OR ) |
in , not in , is , is not , < , <= , > , >= , != , == | 成员测试、身份测试、比较 |
not x | 布尔 NOT |
and | 布尔 AND |
or | 布尔 OR |
:= | 赋值表达式 (Python 3.8 新增) |
重要提示:
- 圆括号
()
拥有最高的优先级,可以用来改变运算的默认顺序。 - 赋值运算符
=
的优先级非常低,通常最后计算。 - 如果表达式中存在多个相同优先级的运算符,它们通常按照从左到右的顺序计算(也有例外,例如幂运算符
**
)。
练习示例
让我们通过一些例子来加深对运算符优先级的理解。
示例 1: 简单算术运算
计算表达式: 15 - 2 * 4
解答:
- 乘法
*
的优先级高于减法-
,所以先计算2 * 4
,结果为8
。 - 然后计算
15 - 8
,结果为7
。
示例 2: 相同优先级运算
计算表达式: 15 - 2 + 4
解答:
- 减法
-
和加法+
具有相同的优先级,所以按照从左到右的顺序计算。 - 先计算
15 - 2
,结果为13
。 - 然后计算
13 + 4
,结果为17
。
示例 3: 使用括号改变优先级
计算表达式: 15 - (2 + 4)
解答:
- 括号
()
具有最高的优先级,所以先计算括号内的表达式2 + 4
,结果为6
。 - 然后计算
15 - 6
,结果为9
。
示例 4: 复杂算术运算
计算表达式: 3 * 2 + 9 / 4 - 10 % 2 ** 2
解答:
- 幂运算
**
优先级最高,先计算2 ** 2
,结果为4
。 表达式变为:3 * 2 + 9 / 4 - 10 % 4
- 乘法
*
、除法/
和取余%
具有相同的优先级,从左到右计算。3 * 2
结果为6
9 / 4
结果为2.25
10 % 4
结果为2
表达式变为:6 + 2.25 - 2
- 加法
+
和减法-
具有相同的优先级,从左到右计算。6 + 2.25
结果为8.25
8.25 - 2
结果为6.25
示例 5: 混合运算
计算表达式: 20 / 4 // 2 * 2 - 4 + 20
解答:
- 除法
/
、整除//
和乘法*
具有相同的优先级,从左到右计算。20 / 4
结果为5.0
5.0 // 2
结果为2.0
2.0 * 2
结果为4.0
表达式变为:4.0 - 4 + 20
- 加法
+
和减法-
具有相同的优先级,从左到右计算。4.0 - 4
结果为0.0
0.0 + 20
结果为20.0
示例 6: 逻辑运算
计算表达式: not 6 <= 4 and 3 ** 3 > 12 / 3
解答:
- 幂运算
**
优先级最高,先计算3 ** 3
,结果为27
。 表达式变为:not 6 <= 4 and 27 > 12 / 3
- 除法
/
的优先级高于比较运算符,计算12 / 3
,结果为4.0
。 表达式变为:not 6 <= 4 and 27 > 4.0
- 比较运算符
<=
和>
具有相同的优先级,从左到右计算。6 <= 4
结果为False
27 > 4.0
结果为True
表达式变为:not False and True
- 逻辑非
not
的优先级高于逻辑与and
,计算not False
,结果为True
。 表达式变为:True and True
- 最后计算逻辑与
and
,True and True
的结果为True
。