基础篇 · Foundations
lv.1 入门
kp-006
控制流(分支与循环)
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. 常见误区
for i in range(len(lst))遍历 —— 反 Pythonic;直接for x in lst,要下标用enumerate。- 在循环里改正在遍历的列表 —— 结果难以预测;应遍历副本
for x in lst[:]或用推导式重建。 - 把 match 当 switch —— 它做的是模式解构,每个 case 是模式而非常量比较,误当常量匹配会静默失配(裸名字是捕获变量!要匹配常量需点号或字面量)。
- 循环变量泄漏出循环 ——
for结束后循环变量仍存在(作用域是函数级),与其他语言不同。
10. 自测题
for x in d:(d 是字典)遍历的是什么?想要键值对怎么办?- 什么情况下
for...else的else会执行? match x: case y: ...中的y是什么?
参考答案
- 遍历键;
for k, v in d.items():。 - 循环正常跑完(未被 break 中断)时。
- 一个捕获变量(绑定任意值),不是与名为 y 的常量比较——要比较常量应写
case CONSTANT:(点号属性)或case "y":。
11. 与其他知识点的关系
12. 延伸阅读
- PEP 634(Structural Pattern Matching)
- Python 官方教程 §4 More Control Flow Tools