Python 流程控制
Python 用缩进组织 if/elif/else、for/while、break/continue/else,以及 3.10+ match/case 的结构化分支。
#type / concept
#status / growing
#tech / dev
#resource / python
#tech / lang / python
[!info] 关联笔记
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:未 break 才执行 else;
# - 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跳过空数据,避免污染业务计数。break与for-else:else表示“没被 break”,适合“搜完没找到”类语义。match适合结构化分流;简单两分支仍可用if。
核心概念与准确模型
if 链
if cond:
...
elif other:
...
else:
...
for 与 while
for x in iterable:调用迭代协议while cond:条件循环break/continue- 循环
else:未break时执行
match/case(3.10+)
- 模式匹配:字面量、序列、映射、守卫
case x if ... - 不是 C 的 fall-through switch
异常不在本篇展开
错误路径用 try/except——见 错误处理。
边界情况与反直觉行为
- 循环 else 常被误读成“条件 else”;它绑定的是“是否 break”。
- 在迭代中修改正在遍历的 list 易漏元素或死逻辑;应迭代拷贝或建新列表。
- 无限 while 必须有明确退出或超时策略。
常见误区
[!warning] 常见误区:用 range(len(xs)) 作为默认遍历方式 错误理解:只有索引循环是正经循环。
正确模型:优先for x in xs;需要索引用enumerate。
工程实践
- 分支超过三层考虑表驱动或策略函数。
- 批处理循环记录“处理/跳过/失败”计数,便于对账。
match用于清晰变体,不替换所有 if。
本节总结
控制流的关键不只是语法,而是块结构、迭代协议与退出条件是否表达了业务。
自测题
- 什么时候
for的else会执行? - 为什么出库示例在
STOP后不再处理后续 SKU?
参考答案
- 循环自然结束且过程中没有
break。 break立即离开循环,符合“本批结束”扫码协议。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Tutorial – Control Flow | 教程 | if/for/while |
| match statement | 规范 | 模式匹配 |