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

结合场景再看三个关注点

  1. continue 跳过空数据,避免污染业务计数。
  2. breakfor-elseelse 表示“没被 break”,适合“搜完没找到”类语义。
  3. 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——见 错误处理

边界情况与反直觉行为

  1. 循环 else 常被误读成“条件 else”;它绑定的是“是否 break”。
  2. 在迭代中修改正在遍历的 list 易漏元素或死逻辑;应迭代拷贝或建新列表。
  3. 无限 while 必须有明确退出或超时策略。

常见误区

[!warning] 常见误区:用 range(len(xs)) 作为默认遍历方式 错误理解:只有索引循环是正经循环。
正确模型:优先 for x in xs;需要索引用 enumerate

工程实践

  • 分支超过三层考虑表驱动或策略函数。
  • 批处理循环记录“处理/跳过/失败”计数,便于对账。
  • match 用于清晰变体,不替换所有 if。

本节总结

控制流的关键不只是语法,而是块结构、迭代协议与退出条件是否表达了业务。

自测题

  1. 什么时候 forelse 会执行?
  2. 为什么出库示例在 STOP 后不再处理后续 SKU?
参考答案
  1. 循环自然结束且过程中没有 break
  2. break 立即离开循环,符合“本批结束”扫码协议。

延伸阅读与资料来源

资料类型支撑内容
Tutorial – Control Flow教程if/for/while
match statement规范模式匹配
创建于 2026/7/15 更新于 2026/7/15