Skip to content

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

解答:

  1. 乘法 * 的优先级高于减法 -,所以先计算 2 * 4,结果为 8
  2. 然后计算 15 - 8,结果为 7

示例 2: 相同优先级运算

计算表达式: 15 - 2 + 4

解答:

  1. 减法 - 和加法 + 具有相同的优先级,所以按照从左到右的顺序计算。
  2. 先计算 15 - 2,结果为 13
  3. 然后计算 13 + 4,结果为 17

示例 3: 使用括号改变优先级

计算表达式: 15 - (2 + 4)

解答:

  1. 括号 () 具有最高的优先级,所以先计算括号内的表达式 2 + 4,结果为 6
  2. 然后计算 15 - 6,结果为 9

示例 4: 复杂算术运算

计算表达式: 3 * 2 + 9 / 4 - 10 % 2 ** 2

解答:

  1. 幂运算 ** 优先级最高,先计算 2 ** 2,结果为 4。 表达式变为:3 * 2 + 9 / 4 - 10 % 4
  2. 乘法 *、除法 / 和取余 % 具有相同的优先级,从左到右计算。
    • 3 * 2 结果为 6
    • 9 / 4 结果为 2.25
    • 10 % 4 结果为 2 表达式变为:6 + 2.25 - 2
  3. 加法 + 和减法 - 具有相同的优先级,从左到右计算。
    • 6 + 2.25 结果为 8.25
    • 8.25 - 2 结果为 6.25

示例 5: 混合运算

计算表达式: 20 / 4 // 2 * 2 - 4 + 20

解答:

  1. 除法 /、整除 // 和乘法 * 具有相同的优先级,从左到右计算。
    • 20 / 4 结果为 5.0
    • 5.0 // 2 结果为 2.0
    • 2.0 * 2 结果为 4.0 表达式变为:4.0 - 4 + 20
  2. 加法 + 和减法 - 具有相同的优先级,从左到右计算。
    • 4.0 - 4 结果为 0.0
    • 0.0 + 20 结果为 20.0

示例 6: 逻辑运算

计算表达式: not 6 <= 4 and 3 ** 3 > 12 / 3

解答:

  1. 幂运算 ** 优先级最高,先计算 3 ** 3,结果为 27。 表达式变为:not 6 <= 4 and 27 > 12 / 3
  2. 除法 / 的优先级高于比较运算符,计算 12 / 3,结果为 4.0。 表达式变为:not 6 <= 4 and 27 > 4.0
  3. 比较运算符 <=> 具有相同的优先级,从左到右计算。
    • 6 <= 4 结果为 False
    • 27 > 4.0 结果为 True 表达式变为:not False and True
  4. 逻辑非 not 的优先级高于逻辑与 and,计算 not False,结果为 True。 表达式变为:True and True
  5. 最后计算逻辑与 andTrue and True 的结果为 True