问题: 逻辑运算符优先级与短路计算

👇 点击展开/折叠 面试背诵模板(建议先背这个) Python 逻辑运算符优先级从高到低为:not > and > or(not 最高,or 最低)。短路计算指 and 和 or 在能确定结果时立即停止求值,不再计算后续表达式:and 左侧为 False 直接返回 False 并跳过右侧;or 左侧为 True 直接返回 True 并跳过右侧。短路特性常用于条件组合、简化 if 语句和避免异常(如 `x and x.y` 防止空指针)。
---

优先级与短路行为速览

运算符 优先级(高→低) 短路规则 返回值说明
not 最高(先算) 不涉及短路 返回布尔值(True/False)
and 中等 左假则右不执行,返回左值;左真则返回右值 返回最后一个求值的操作数
or 最低(后算) 左真则右不执行,返回左值;左假则返回右值 返回最后一个求值的操作数

优先级与短路结合示例

1
2
3
4
5
6
7
8
9
10
# 优先级示例:not 先算,and 次之,or 最后
print(True or False and not False) # True (等价于 True or (False and True))
# 若不理解优先级,可能误判为 (True or False) and True → True,结果相同但逻辑不同

# 短路示例:避免异常
def divide(a, b):
return b != 0 and a / b # 若 b=0,右侧不执行,返回 False

print(divide(10, 0)) # False(不触发 ZeroDivisionError)
print(divide(10, 2)) # 5.0(返回右侧计算结果)

常见陷阱与注意事项

  • not 优先级易被忽视:not a == b 等价于 (not a) == b,而非 not (a == b)。正确写法应为 not (a == b) 或 a != b。
  • and 和 or 返回的是操作数本身而非布尔值:1 and 'hello' 返回 'hello',0 or 42 返回 42。利用此特性可实现条件赋值,但可读性较差(推荐用 if 或三元表达式)。
  • 短路依赖求值顺序:a or b and c 因优先级等价于 a or (b and c),且 or 左侧为真时,整个 b and c 不会执行。

应用场景与最佳实践

场景 写法 说明
条件执行函数 x is not None and process(x) 当 x 不为 None 时才调用 process
默认值设定 name = input() or "匿名" 若输入空字符串,取默认值
多层条件 if a or b and not c: 注意加括号明确意图,避免歧义
链式比较(不是逻辑运算符) 0 < x < 10 Python 特有,不等价于 0 < x and x < 10,但效果相同且更简洁

性能考量(微优化)

短路求值不仅保护代码安全,还能提升性能:将计算代价低且更易为 False 的条件放在 and 左侧(或更易为 True 的条件放在 or 左侧),可减少不必要的运算。例如 costly_check() and quick_check() 中,若 costly_check 通常为 False,则 quick_check 被跳过,节省资源。