Python 流程控制
Python 用缩进组织 if/elif/else、for/while、break/continue/else,以及 3.10+ match/case 的结构化分支。
#concept
#growing
#dev
#python
#python
[!info] related notes
Python 流程控制
这个概念为什么出现
业务规则是分支与循环的组合:订单状态机、批处理对账、重试回退。Python 用缩进表达块结构,并用 for 迭代可迭代对象,而不是经典 C 风格三段 for。
[!abstract] 一句话理解 Python 控制流以缩进定块:
if/elif/else分支,for/while循环(可带else),break/continue改变循环,match/case(3.10+)做结构化模式匹配。
最小可运行示例
先把示例放进业务场景,再看代码:
场景:仓储出库扫描枪处理条码队列
扫码枪一次给出多个条码。服务要:
- 跳过空扫
- 对
STOP结束本批 - 统计成功出库数
- 用
match解释条码前缀类型(SKU / 库位)
# outbound_scan_flow.py
# 业务意图:处理一批扫码事件,输出出库摘要。
# 教学点:
# - for 迭代序列;continue/break 控制循环;
# - for-else:正常耗尽才执行 else,break/return/异常退出会跳过;
# - match/case 按前缀分流(3.10+)。
def process_scans(codes: list[str]) -> str:
shipped = 0
for raw in codes:
code = raw.strip()
if not code:
continue # 空扫跳过
if code == "STOP":
break # 本批结束
match code.split("-", 1)[0]:
case "SKU":
shipped += 1
case "LOC":
# 库位码只记录,不影响出库计数
pass
case _:
raise ValueError(f"unknown code: {code}")
else:
# 没有遇到 STOP,正常扫完
return f"done shipped={shipped} end=natural"
return f"done shipped={shipped} end=stop"
def main() -> None:
print(process_scans(["SKU-1", "", "LOC-A1", "SKU-2", "STOP", "SKU-3"]))
print(process_scans(["SKU-1", "SKU-2"]))
if __name__ == "__main__":
main()
建议运行:
python outbound_scan_flow.py
期望输出:
done shipped=2 end=stop
done shipped=2 end=natural
结合场景再看三个关注点
continue跳过空数据,避免污染业务计数。- for 的 else 在迭代正常耗尽时执行(空迭代也算);break、return 或异常离开循环均不会执行它,continue 本身不阻止最终 else。
match适合结构化分流;简单两分支仍可用if。
核心概念与准确模型
if 链
if cond:
...
elif other:
...
else:
...
for 与 while
for x in iterable:调用迭代协议while cond:条件循环break/continue- 循环 else:for 正常耗尽或 while 条件变假时执行;并非只要没有 break 就一定执行。
match/case(3.10+)
- 模式匹配:字面量、序列、映射、守卫
case x if ... - 第一个匹配且守卫为真的 case 执行后结束 match,不会 fall-through。裸名字模式通常是捕获并绑定,不是读取同名常量;常量模式应使用字面量或限定名。
异常不在本篇展开
错误路径用 try/except——见 错误处理。
边界情况与反直觉行为
- 循环 else 绑定对应循环的正常结束;嵌套循环中的 break 只退出最内层循环。
- 在迭代中修改正在遍历的 list 易漏元素或死逻辑;应迭代拷贝或建新列表。
- 无限 while 必须有明确退出或超时策略。
常见误区
[!warning] 常见误区:用 range(len(xs)) 作为默认遍历方式 错误理解:只有索引循环是正经循环。
正确模型:优先for x in xs;需要索引用enumerate。
工程实践
- 分支超过三层考虑表驱动或策略函数。
- 批处理循环记录“处理/跳过/失败”计数,便于对账。
match用于清晰变体,不替换所有 if。
本节总结
控制流的关键不只是语法,而是块结构、迭代协议与退出条件是否表达了业务。
自测题
- 什么时候
for的else会执行? - 为什么出库示例在
STOP后不再处理后续 SKU?
参考答案
- 迭代器正常耗尽,包括一开始就是空序列;若 break、return 或异常离开循环则不执行。
break立即离开循环,符合“本批结束”扫码协议。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Tutorial – Control Flow | 教程 | if/for/while |
| match statement | 规范 | 模式匹配 |