问题: 逻辑运算符优先级与短路计算
👇 点击展开/折叠 面试背诵模板(建议先背这个)
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
| print(True or False and not False)
def divide(a, b): return b != 0 and a / b
print(divide(10, 0)) print(divide(10, 2))
|
常见陷阱与注意事项
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 被跳过,节省资源。