生成器通过yield将分情况执行转化为按需产出,避免嵌套判断与状态管理:各分支独立yield、用yield from委托子逻辑、生成器表达式替代嵌套循环、以yield作为状态机断点。

生成器能简化复杂逻辑分支,关键在于把“分情况执行”转化为“按需产出”,避免层层嵌套的判断和临时状态管理。
用 yield 拆解多路分支
当一段逻辑需要根据多个条件走不同路径并产出结果时,与其写一堆 if/elif/else 块,不如让每个分支独立 yield。函数体保持线性,控制流由调用方决定。
- 比如处理不同数据类型:遇到字符串 yield 处理后的字符串,遇到数字 yield 平方值,遇到 None 就跳过——全部平铺在同一个 for 循环里,不缩进、不嵌套
- 避免在函数内维护 flag 或 result 列表;每次满足某条件就 yield 一个明确值,语义清晰
用 yield from 合并子逻辑单元
当分支本身还包含子分支或重复结构(如遍历树、解析嵌套 JSON、展开多级菜单),把子逻辑封装成独立生成器,主生成器用 yield from 委托,而不是手动循环+判断。
- 例如:主生成器负责“按类型分发”,字符串类型 → yield from process_string(),列表类型 → yield from process_list(),每支都可递归、可测试、可复用
- 异常、return 值、中途终止都会自动透传,不用额外写 try/except 或 break 逻辑
用生成器表达式替代带条件的嵌套循环
当分支逻辑本质是“筛选 + 变换 + 组合”,比如从二维结构中提取满足条件的元素,直接用生成器表达式一行搞定,比 for 套 for + if 更接近自然语言。
- 例如:(item.upper() for row in data for item in row if isinstance(item, str) and len(item) > 2)
- 它隐含了三层逻辑:遍历行、遍历项、判断类型与长度、再变换——但代码无嵌套、无临时变量、不可变语义明确
把状态机逻辑交给生成器暂停机制
涉及多阶段、有先后依赖的分支(如协议解析、状态流转、分步校验),用 yield 当作“断点”,每次 yield 后由外部决定下一步输入或是否继续。这比用 while + state 变量 + 大 switch 清晰得多。
- 例如:登录流程生成器,yield 'check_user' → 外部验证用户名 → send(True) → yield 'check_pass' → …… 每个分支只专注当前状态,不耦合后续
- 暂停点即分支出口,恢复点即入口,逻辑边界天然隔离











