Python中的生成器
生成器是一种特殊的迭代器,它允许你按需生成值,而不是一次性把所有值都存储在内存中。生成器使用 yield 关键字而不是 return,每次 yield 会暂停函数的执行状态,并在下次调用时从暂停处继续。
核心特点
- 惰性求值:只在需要时生成下一个值,不预先计算所有结果。
- 内存高效:适合处理大数据流或无限序列,因为它一次只保存一个值。
- 可迭代:生成器对象可以直接用在
for循环或任何接受可迭代对象的地方。
两种创建方式
1. 生成器函数(使用 yield)
def count_up_to(n):
i = 0
while i < n:
yield i # 返回 i,并暂停函数状态
i += 1
# 使用生成器
for num in count_up_to(5):
print(num) # 输出 0,1,2,3,4
2. 生成器表达式(类似列表推导式,但使用圆括号)
squares = (x*x for x in range(10)) # 生成器对象
print(next(squares)) # 0
print(next(squares)) # 1
与普通函数的区别
| 特性 | 普通函数 | 生成器函数 |
|---|---|---|
| 返回值 | return 一次返回,函数结束 | yield 多次返回,函数暂停 |
| 状态 | 每次调用重新开始 | 保留上次暂停时的局部变量 |
| 内存 | 可能一次性返回大列表 | 惰性生成,节省内存 |
| 使用 | 直接获得结果 | 返回生成器对象,需迭代获取 |
实际应用示例
读取大文件(避免内存溢出):
def read_large_file(file_path):
with open(file_path) as f:
for line in f:
yield line # 逐行返回,不一次性加载整个文件
for line in read_large_file('huge.log'):
process(line)
生成无限序列:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for _ in range(10):
print(next(fib)) # 打印前10个斐波那契数
关键方法
next(g):获取下一个值,生成器会执行到下一个yield。g.send(value):向生成器内部发送一个值,并继续执行(用于协程)。g.throw(exception):在生成器内部抛出异常。g.close():终止生成器。
生成器是 Python 实现“流式处理”和“协程”的基础工具,理解它对写出高效、优雅的代码很有帮助。