一、生成器的核心概念
- 定义
- 生成器是一种特殊的迭代器,通过
yield
关键字逐步生成值,而非一次性计算所有结果。 - 两种创建方式:生成器函数(含
yield
的函数)和生成器表达式。
- 生成器是一种特殊的迭代器,通过
- 核心特点
- 惰性求值:按需生成数据,节省内存。
- 状态保留:每次
yield
后暂停,保留局部变量和状态,下次调用时继续执行。
二、生成器的创建方式
1. 生成器函数
python
复制
def count_up_to(n): count = 0 while count < n: yield count # 每次产生一个值后暂停 count += 1 gen = count_up_to(3) print(next(gen)) # 输出 0 print(next(gen)) # 输出 1
2. 生成器表达式
类似列表推导式,但用圆括号:
python
复制
gen = (x**2 for x in range(3)) print(list(gen)) # 输出 [0, 1, 4]
三、生成器的工作机制
- 执行流程
调用生成器函数返回生成器对象,通过next()
或循环触发执行,遇到yield
返回值并暂停,下次next()
时恢复。 - 终止条件
生成器函数执行完毕(或return
语句)时抛出StopIteration
异常。
示例:python复制def simple_gen(): yield 1 return “结束” # Python3.3+支持返回值 gen = simple_gen() print(next(gen)) # 输出 1 try: next(gen) except StopIteration as e: print(e.value) # 输出 “结束”
四、生成器的优势
- 内存高效
无需预存全部数据,适合处理大文件或无限序列。
示例:逐行读取大文件python复制def read_large_file(file_path): with open(file_path, ‘r’) as f: for line in f: yield line.strip() - 代码简洁
用生成器替代手动实现迭代器(__iter__
,__next__
),减少样板代码。 - 支持无限序列
示例:无限斐波那契数列python复制def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b
五、进阶用法
- 双向通信
使用.send(value)
向生成器发送数据:python复制def interactive_gen(): while True: value = yield # 接收外部发送的值 yield value * 2 gen = interactive_gen() next(gen) # 启动生成器(执行到第一个yield) print(gen.send(10)) # 发送10,输出20 - 协程与任务调度
生成器可用于实现简单的协程,结合yield
暂停/恢复执行,处理异步逻辑。
六、常见问题与注意点
- 单次遍历
生成器只能迭代一次,若需重用需重新创建对象。 - 性能权衡
生成器的延迟计算可能增加CPU时间,需根据场景选择。
七、总结
- 适用场景:大数据流处理、无限序列、内存优化、协程实现。
- 关键选择:当内存限制严格或需按需计算时,优先使用生成器。
通过理解生成器的惰性求值机制和状态保存特性,可以更高效地处理迭代任务,提升代码性能和可维护性。
发表回复