Python运算符的优先级

259 阅读5分钟

一、前言

在 Python 编程中,运算符的优先级(Operator Precedence) 决定了表达式中多个运算符执行的顺序。如果不了解或忽略优先级规则,可能会导致程序逻辑错误或输出结果与预期不符。

例如:

result = 3 + 5 * 2

虽然看起来简单,但如果你不知道 * 的优先级高于 +,你可能会误以为结果是 16,而实际上它的正确结果是 13

本文将带你深入了解:

  • Python 中运算符优先级的基本概念;
  • 各类运算符的优先级排序;
  • 结合性(左结合 vs 右结合);
  • 实际开发中的常见问题与解决方法;
  • 提高代码可读性的最佳实践;

无论你是初学者还是有一定经验的开发者,掌握运算符优先级都是写出高效、准确代码的关键!

二、什么是运算符优先级?

运算符优先级是指在表达式中多个运算符同时存在时,Python 解释器决定先执行哪个运算符的规则。

例如:

a = 10 + 2 * 3

在这个表达式中,由于乘法运算符 * 的优先级高于加法运算符 +,所以会先计算 2 * 3,再进行加法操作,最终 a 的值为 16

📌 如果你不希望依赖默认优先级,可以使用括号 () 来显式指定运算顺序。

a = (10 + 2) * 3  # a = 36

三、Python 运算符优先级表(从高到低)

优先级运算符描述
1()括号(分组表达式)
2**幂运算
3~+-单目运算符(位取反、正号、负号)
4*///%乘除类运算符
5+-加减运算符
6<<>>位移运算符
7&按位与
8^按位异或
9``
10==!=><>=<=比较运算符
11isis notinnot in成员和身份判断
12not逻辑非
13and逻辑与
14or逻辑或

📌 记住这个表格不是目的,关键是在实际编码中灵活运用并理解其含义。

四、结合性(Associativity)

当表达式中出现多个相同优先级的运算符时,结合性(Associativity) 决定它们的执行顺序:是从左向右,还是从右向左。

✅ 左结合(Left Associative)示例:

result = 10 - 5 - 2
# 等价于:(10 - 5) - 2 → 5 - 2 → 3

✅ 右结合(Right Associative)示例:

幂运算符 ** 是右结合的:

result = 2 ** 3 ** 2
# 等价于:2 ** (3 ** 2) → 2 ** 9 → 512

而不是 (2 ** 3) ** 2 = 64

五、常见运算符优先级陷阱与解决方案

❗ 陷阱1:逻辑运算符与比较运算符混用

x = 5
if x == 5 or 3:
    print("True")

你以为这是判断 x == 5 或者 x == 3?其实它是这样执行的:

if (x == 5) or (3): ...

因为 3 是一个“真值”,所以整个条件恒为 True

✅ 正确写法应为:

if x == 5 or x == 3:
    print("True")

❗ 陷阱2:赋值运算符与其他运算符混淆

a = b = 5
print(a, b)

这没问题,但如果写成:

if a = 5:  # 语法错误!
    pass

你会得到一个语法错误。因为在 Python 中,赋值不能出现在表达式中(Python 3.8+ 引入了海象运算符 := 才支持类似功能)。

❗ 陷阱3:忽视布尔运算短路特性

def func():
    print("Function called")
    return True

if False and func():
    pass

上面的 func() 不会被调用,因为 False and ... 直接返回 False,这就是所谓的短路求值

✅ 在处理资源加载、函数调用等场景时要特别注意这一点。

六、提升代码可读性的最佳实践

实践建议说明
✅ 使用括号明确优先级即使你知道优先级,也建议使用括号提高可读性
✅ 避免一行写太多逻辑将复杂表达式拆分为多行变量赋值更清晰
✅ 多用中间变量命名如 is_valid = (age > 18) and (gender == "male")
✅ 注意布尔表达式的顺序利用短路机制优化性能(如先判断轻量条件)
✅ 使用 PEP8 标准格式化代码提升整体可读性,减少歧义

七、实战案例解析

✅ 示例1:数学表达式优先级

result = 3 + 5 * 2 ** 3 - 4 / 2

按照优先级分析:

  1. 2 ** 3 → 8
  2. 5 * 8 → 40
  3. 4 / 2 → 2
  4. 3 + 40 - 2 → 41

最终结果为:41.0

✅ 示例2:逻辑表达式优先级

x = 10
y = 20
z = 30

if x < y and y < z or x > 100:
    print("条件成立")

等价于:

if ((x < y) and (y < z)) or (x > 100):
    print("条件成立")

结果为 True

✅ 示例3:复合赋值与逻辑结合

a = 5
b = 10
c = a + 3 if b > 5 else 0

这是一个三元运算符的表达式,等价于:

if b > 5:
    c = a + 3
else:
    c = 0

结果:c = 8

八、总结对比表

运算符类型优先级是否右结合常见用途
括号 ()最高❌ 否改变执行顺序
幂 **✅ 是数学运算
乘除 * / // %❌ 否数学运算
加减 + -❌ 否数学运算
比较运算符 >, <, ==❌ 否条件判断
逻辑运算符 not, and, or❌ 否控制流程
赋值运算符 =, +=, -=最低❌ 否变量赋值

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!