>>>PyPathPython 学习站
首页›基础篇›kp-006
基础篇 · Foundations lv.1 入门 kp-006

控制流(分支与循环)

前置知识:kp-005

1. 一句话定义

Python 用缩进表达代码块(不是花括号),用 if/match 分支、for/while 循环组织执行路径;for 本质是"迭代协议"的语法糖。

2. 为什么重要

控制流是所有程序的骨架;Python 特色在于 for 是对任意可迭代对象的迭代,而不是下标循环。这个观念建立起来,后面推导式、生成器、asyncio 全部水到渠成。

3. 前置知识

kp-004(序列与真值)、kp-005(比较与逻辑运算符)。

4. 核心概念

  • 缩进即语法:同级语句缩进一致,推荐 4 空格(PEP 8)。
  • 真值测试:空容器、0、""、None、False 为假,其余默认为真(对象可用 __bool__/__len__ 定制,见 kp-019)。
  • for-in 循环:for x in it: 对可迭代对象逐个取值,不是 for i = 0; ... 的计数循环。
  • match-case(3.10+):结构化模式匹配,能解构序列/映射,不是 C 的 switch。

5. 原理与机制

python
# 分支
if score >= 90:
    grade = "A"
elif score >= 60:
    grade = "B"
else:
    grade = "C"

# 循环 + 循环变量作用
for i, name in enumerate(["a", "b"]):     # 需要下标时用 enumerate
    print(i, name)

# for-else:循环未被 break 时执行(冷知识但真实存在)
for n in [2, 4, 6]:
    if n % 2:
        break
else:
    print("全是偶数")

# match:结构化匹配
def handle(cmd):
    match cmd.split():
        case ["go", direction]:
            return f"向 {direction} 走"
        case ["look"]:
            return "四周看了看"
        case _:
            return "不认识"

while 同理支持 break/continue/else;无 C 式三段 for,需要计数时用 range。

6. 关键事实(模型/图示)

text
for x in iterable:
    ↑ iter(iterable) 取迭代器,反复 next(),StopIteration → 结束
      这就是 kp-012 的内容,for 只是它的糖

7. 直观类比

Python 的 for 像自助餐传送带:菜(元素)一个个转过来,你取一个吃一个,转完(StopIteration)自动离场;C 的 for 是站在传送带前盯着编号窗口报号取菜。

8. 实例与案例

python
# 遍历字典
scores = {"amy": 90, "bob": 75}
for name, s in scores.items():
    print(f"{name}: {s}")

# 多分支替代品:match 对 JSON 的解构
match payload:
    case {"type": "user", "name": str(name)}:
        print("用户", name)

9. 常见误区

  1. for i in range(len(lst)) 遍历 —— 反 Pythonic;直接 for x in lst,要下标用 enumerate。
  2. 在循环里改正在遍历的列表 —— 结果难以预测;应遍历副本 for x in lst[:] 或用推导式重建。
  3. 把 match 当 switch —— 它做的是模式解构,每个 case 是模式而非常量比较,误当常量匹配会静默失配(裸名字是捕获变量!要匹配常量需点号或字面量)。
  4. 循环变量泄漏出循环 —— for 结束后循环变量仍存在(作用域是函数级),与其他语言不同。

10. 自测题

  1. for x in d:(d 是字典)遍历的是什么?想要键值对怎么办?
  2. 什么情况下 for...else 的 else 会执行?
  3. match x: case y: ... 中的 y 是什么?
参考答案
  1. 遍历键;for k, v in d.items():。
  2. 循环正常跑完(未被 break 中断)时。
  3. 一个捕获变量(绑定任意值),不是与名为 y 的常量比较——要比较常量应写 case CONSTANT:(点号属性)或 case "y":。

11. 与其他知识点的关系

  • kp-011 推导式:常见 for 循环的声明式替代。
  • kp-012 迭代器协议:for 背后的机制。
  • kp-007 函数:把控制流封装成可复用单元。

12. 延伸阅读

  • PEP 634(Structural Pattern Matching)
  • Python 官方教程 §4 More Control Flow Tools