Python 条件判断与布尔逻辑
if/elif/else 结构按顺序检查条件,一旦某个条件为真,执行对应分支并立即跳出整个判断链。
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
else:
grade = "C or below"
当多个条件存在重叠时,书写顺序直接决定执行结果。
真值判定(Truthiness)
Python 中,None、False、数值 0 以及空容器(如 [], {}, "")默认被视为假值(falsy)。绝大多数其他对象被视为真值(truthy)。
对于自定义类,可以通过实现 __bool__ 或 __len__ 方法来定制其真值行为。
注意区分“空”与“缺失”: 如果业务逻辑中“空列表”和“未初始化(None)”代表不同含义,务必使用显式比较,不要依赖隐式真值转换。
if records is None:
# 数据尚未加载或获取失败
load_records()
elif not records:
# 数据已加载,但结果为空
report_empty_dataset()
比较运算符
==和!=:比较值是否相等。is和is not:比较身份(是否为同一个对象;内存地址是 CPython 的实现细节)。in和not in:检查成员关系。- 链式比较:支持
lower <= value < upper这种数学风格的连续比较。
避坑指南:
严禁使用 is 来比较数值或字符串的值。解释器可能会复用某些小整数或短字符串的对象(对象驻留机制),但这只是实现细节,并非语言规范保证。依赖 is 进行值比较会导致难以排查的 Bug。
短路求值(Short-circuiting)
and 和 or 运算符从左向右求值,且返回的是操作数本身,而不一定是布尔值 True 或 False。
# 如果 supplied_name 为假(None, "", 0 等),则返回 "anonymous"
# 否则返回 supplied_name 本身
display_name = supplied_name or "anonymous"
# 如果 denominator 为假(0),则返回 0(假值),避免除零错误
# 否则返回计算结果
safe_ratio = denominator and numerator / denominator
使用建议:
- 利用短路特性进行前置检查(Guard Clauses)是常见且高效的写法。
- 但如果表达式返回类型混杂(有时是字符串,有时是数字),会模糊代码契约,降低可读性。此时建议拆分为标准的
if语句。
分支设计原则
- 提前返回(Early Return):优先处理无效输入或异常边界情况,减少后续逻辑的嵌套深度。
- 提取谓词(Predicate):如果条件表达式包含复杂的业务逻辑,将其提取为具有明确语义的函数(如
is_valid_user()),提高可读性。 - 策略模式/查找表:当分支逻辑庞大且基于稳定的键(如状态码、类型标识)选择行为时,考虑使用字典查找表或多态,替代冗长的
if-elif链。 - 合理使用
match:Python 3.10+ 的match语句适用于结构模式匹配。不要为了炫技而强行用它替代简单的相等判断链,保持代码风格一致。
表达式的边界
表达式参考规定:比较运算优先于 not,随后是 and,最后是 or。混合条件加上括号更容易阅读。not 总是返回布尔值,链式比较中的中间表达式只求值一次。
assert not "" # 空字符串
assert bool("0") and bool("False") # 都不是空字符串
assert (0 or 7) == 7
assert (0 and 7) == 0
assert (2 < 3 < 4) is True
value = 0
result = value if value is not None else 10
assert result == 0
判断两个候选值应写 x == "a" or x == "b",或 x in {"a", "b"};x == "a" or "b" 始终为真,因为 "b" 非空。条件表达式 yes if condition else no 只计算被选中的结果。value or default 会把有效的零值也替换掉,而不只是替换 None。多个独立的 if 可能执行多个分支;if/elif 链至多选择一个。可选的 else 处理所有条件都不满足的情况。