← 返回 Day 5 正文

Day 5 · 图解

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
   │        │
   ▼        ▼
 "成年"   "未成年"