跳到主要内容

Python 条件判断与布尔逻辑

if/elif/else 结构按顺序检查条件,一旦某个条件为真,执行对应分支并立即跳出整个判断链。

if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
else:
grade = "C or below"

当多个条件存在重叠时,书写顺序直接决定执行结果。

真值判定(Truthiness)

Python 中,NoneFalse、数值 0 以及空容器(如 [], {}, "")默认被视为假值(falsy)。绝大多数其他对象被视为真值(truthy)。

对于自定义类,可以通过实现 __bool____len__ 方法来定制其真值行为。

注意区分“空”与“缺失”: 如果业务逻辑中“空列表”和“未初始化(None)”代表不同含义,务必使用显式比较,不要依赖隐式真值转换。

if records is None:
# 数据尚未加载或获取失败
load_records()
elif not records:
# 数据已加载,但结果为空
report_empty_dataset()

比较运算符

  • ==!=:比较是否相等。
  • isis not:比较身份(是否为同一个对象;内存地址是 CPython 的实现细节)。
  • innot in:检查成员关系。
  • 链式比较:支持 lower <= value < upper 这种数学风格的连续比较。

避坑指南: 严禁使用 is 来比较数值或字符串的值。解释器可能会复用某些小整数或短字符串的对象(对象驻留机制),但这只是实现细节,并非语言规范保证。依赖 is 进行值比较会导致难以排查的 Bug。

短路求值(Short-circuiting)

andor 运算符从左向右求值,且返回的是操作数本身,而不一定是布尔值 TrueFalse

# 如果 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 语句。

分支设计原则

  1. 提前返回(Early Return):优先处理无效输入或异常边界情况,减少后续逻辑的嵌套深度。
  2. 提取谓词(Predicate):如果条件表达式包含复杂的业务逻辑,将其提取为具有明确语义的函数(如 is_valid_user()),提高可读性。
  3. 策略模式/查找表:当分支逻辑庞大且基于稳定的键(如状态码、类型标识)选择行为时,考虑使用字典查找表或多态,替代冗长的 if-elif 链。
  4. 合理使用 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 处理所有条件都不满足的情况。

参考资源

探索关联打开关联网络