Day 005 — 布尔值与条件判断:图解
一图胜千言:用视觉方式理解布尔逻辑与条件判断的底层原理。
1. bool 是 int 的子类
Python 类型层级关系:
┌──────────────────────────────────────┐
│ object │
└──────────────────────────────────────┘
│
┌─────────────┴─────────────┐
│ │
┌──────┴──────┐ ┌───────┴────────┐
│ int │ │ str │ ← 其他类型...
└──────┬──────┘ └────────────────┘
│
┌──────┴──────┐
│ bool │ ← True 实际上就是 int(1),False 就是 int(0)
└─────────────┘
True + True = 2 (1 + 1 = 2)
True * 10 = 10 (1 * 10 = 10)
True > False = True (1 > 0 = True)
2. Truthy / Falsy 判断流程
当执行 if x: 时,Python 内部的判断流程:
┌──────────┐
│ if x: │
└────┬─────┘
│
▼
┌─────────────────┐
│ bool(x) 被调用 │
└────────┬────────┘
│
▼
┌─────────────────────┐
│ x 定义了 __bool__? │
└────────┬────────────┘
┌───┴───┐
│ │
Yes No
│ │
▼ ▼
┌────────┐ ┌──────────────────────────┐
│ 返回 │ │ x 定义了 __len__? │
│__bool__│ └────────┬─────────────────┘
│ 结果 │ ┌───┴───┐
└────────┘ Yes No
│ │
▼ ▼
┌────────┐ ┌───────────┐
│ 返回 │ │ 默认返回 │
│len != 0│ │ True │
└────────┘ └───────────┘
Falsy 值清单(共 8 种):
┌──────────┬──────────────────────┐
│ 类别 │ 具体值 │
├──────────┼──────────────────────┤
│ 布尔 │ False │
│ 空值 │ None │
│ 零值 │ 0, 0.0, 0j │
│ 空字符串 │ "" │
│ 空列表 │ [] │
│ 空元组 │ () │
│ 空字典 │ {} │
│ 空集合 │ set(), frozenset() │
└──────────┴──────────────────────┘
3. 短路求值(Short-Circuit)流程图
and 短路求值
表达式 A and B
┌──────────┐
│ 计算 A │
└────┬─────┘
│
▼
┌─────────┐
│ A 是 │
│ Truthy? │
└──┬──┬───┘
│ │
Yes No
│ │
▼ ▼
┌────────┐ ┌────────┐
│ 计算 B │ │返回 A │ ← B 被跳过(短路!)
│ 返回 B │ │(Falsy) │
└────────┘ └────────┘
实际例子:
0 and 1/0
计算 0 → Falsy → 直接返回 0 → 1/0 永远不会被执行!
↑ 这就是短路 —— 避免了除零错误
or 短路求值
表达式 A or B
┌──────────┐
│ 计算 A │
└────┬─────┘
│
▼
┌─────────┐
│ A 是 │
│ Truthy? │
└──┬──┬───┘
│ │
Yes No
│ │
▼ ▼
┌────────┐ ┌────────┐
│返回 A │ │ 计算 B │ ← A 是 Falsy,继续
│(Truthy)│ │ 返回 B │
└────────┘ └────────┘
↑ or 的短路:A 真则不用算 B
实际例子:
True or risky_function()
计算 True → Truthy → 直接返回 True → risky_function 不会被调用!
4. if/elif/else 执行流程
程序执行到 if 语句时:
┌────────────┐
│ 开始 │
└─────┬──────┘
│
┌────────▼────────┐
│ if 条件表达式 │
│ (计算 True/False)│
└────────┬────────┘
│
┌────────▼────────┐
│ 结果为 True? │
└──┬────────┬─────┘
│ │
Yes No
│ │
┌─────▼──┐ ┌──▼──────────┐
│ 执行 │ │ 有 elif? │
│ if 块 │ └──┬───────────┘
└─────┬──┘ │
│ ┌───┴───┐
│ Yes No
│ │ │
│ ┌─▼───┐ ┌─▼──────┐
│ │ 计算 │ │ 有 else?│
│ │ elif │ └──┬─────┘
│ │ 条件 │ ┌─┴──┐
│ └─┬───┘ Yes No
│ │ │ │
│ ┌─▼──┐ ┌▼──┐ ┌▼───┐
│ │ T? │ │else│ │跳过│
│ └┬───┘ │块 │ └────┘
│ ┌─┴─┐ └┬──┘
│ Yes No │
│ │ │ │
│ ┌▼─┐ │ │
│ │执│ │ │
│ │行│ │ │
│ │el│ │ │
│ │if│ │ │
│ │块│ │ │
│ └──┘ │ │
│ │ │
└──────┴─┘
│
┌────────▼────────┐
│ 继续执行后续代码 │
└─────────────────┘
5. 运算符优先级总图
高优先级
▲
│
┌────────────────┐
│ (...) │ ← 括号永远最高
├────────────────┤
│ ** │ ← 幂运算(右结合)
├────────────────┤
│ +x -x ~x │ ← 一元运算符
├────────────────┤
│ * / // % │ ← 乘除
├────────────────┤
│ + - │ ← 加减
├────────────────┤
│ << >> │ ← 位移
├────────────────┤
│ & │ ← 位与
├────────────────┤
│ ^ │ ← 位异或
├────────────────┤
│ | │ ← 位或
├────────────────┤
│ == != > < │ ← 比较 + is + in
│ >= <= is in │
├────────────────┤
│ not │ ← 逻辑非
├────────────────┤
│ and │ ← 逻辑与
├────────────────┤
│ or │ ← 逻辑或(最低逻辑优先级)
├────────────────┤
│ if-else (三元) │ ← 条件表达式
├────────────────┤
│ := (海象) │ ← 赋值表达式
└────────────────┘
│
▼
低优先级
6. 守卫子句 vs 嵌套 if 对比
❌ 嵌套过深(反模式):
if condition_A:
if condition_B:
if condition_C:
do_something()
else:
handle_not_C()
else:
handle_not_B()
else:
handle_not_A()
→ 缩进灾难!逻辑难以追踪,修改易出错。
✅ 守卫子句(推荐模式):
if not condition_A:
handle_not_A()
return
if not condition_B:
handle_not_B()
return
if not condition_C:
handle_not_C()
return
do_something()
→ 扁平化!每个条件独立,一目了然。
→ 本质:用 return 提前退出,消除嵌套。
7. 三元表达式对照图
传统 if/else:
┌──────────────┐
│ 条件判断 │
└──────┬───────┘
│
┌───────────┴───────────┐
│ │
┌────▼────┐ ┌────▼────┐
│ True │ │ False │
│ 时执行 │ │ 时执行 │
│ 这里 │ │ 这里 │
└─────────┘ └─────────┘
三元表达式:
value = 值_if_true if 条件 else 值_if_false
└────┬─────┘ ──┬── └────┬─────┘
│ │ │
▼ ▼ ▼
条件满足时 条件判断 条件不满足时
使用此值 使用此值
示例:
status = "成年" if age >= 18 else "未成年"
age >= 18?
│
┌───┴───┐
Yes No
│ │
▼ ▼
"成年" "未成年"