← [ BACK_TO_NOTES ]

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

结合场景再看三个关注点

  1. continue 跳过空数据,避免污染业务计数。
  2. for 的 else 在迭代正常耗尽时执行(空迭代也算);break、return 或异常离开循环均不会执行它,continue 本身不阻止最终 else。
  3. 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——见 错误处理。

边界情况与反直觉行为

  1. 循环 else 绑定对应循环的正常结束;嵌套循环中的 break 只退出最内层循环。
  2. 在迭代中修改正在遍历的 list 易漏元素或死逻辑;应迭代拷贝或建新列表。
  3. 无限 while 必须有明确退出或超时策略。

常见误区

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

工程实践

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

本节总结

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

自测题

  1. 什么时候 for 的 else 会执行?
  2. 为什么出库示例在 STOP 后不再处理后续 SKU?
参考答案
  1. 迭代器正常耗尽,包括一开始就是空序列;若 break、return 或异常离开循环则不执行。
  2. break 立即离开循环,符合“本批结束”扫码协议。

延伸阅读与资料来源

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

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本