生成器核心定位
- 迭代器的一种简洁实现
- 无需高级魔法方法、内核对象
- 基于普通函数+yield语句实现
生成器存在的意义
- 简化代码:替代迭代器的类定义与方法实现
- 实现协同程序:函数可暂停/挂起,后续恢复执行
生成器 vs 普通函数
- 普通函数:从第一句执行,结束于return/异常/语句执行完毕;调用结束局部变量销毁
- 生成器函数:含yield语句;yield类似return但会暂停函数;下次调用从暂停处继续
生成器基础使用示例
- 定义:函数内加yield语句(def my_gen(): print("执行"); yield 1; yield 2)
- 调用:g = my_gen() → next(g)触发执行,暂停在对应yield处
- 遍历:for循环自动调用next+捕获StopIteration异常
生成器实战:斐波那契数列
- 特点:死循环结构但因yield暂停,不占用CPU
- 实现:通过yield返回数列项,for循环控制输出100以内数值
推导式拓展:生成器推导式
- 列表推导式:[i for i in range(100) if not i%2 and i%3] → 100内被2整除且不被3整除的数
- 字典推导式:{i:i%2==0 for i in range(10)} → 0-9数字是否为偶数的字典
- 集合推导式:{i for i in [1,1,2,3,4,4,5]} → 自动去重的集合
- 生成器推导式:(i for i in range(10)) → 返回generator object;可next调用;作为函数参数可省略括号
课后学习建议
- 阅读推荐文章:深入理解协同程序、生成器特征
- 完成课后作业:自学新知识并实践