Python 生成器详解
前言
生成器是 Python 中非常有用的一种迭代器,其核心特性是实现惰性计算(Lazy Evaluation)和节省内存。与列表等容器不同,生成器不会一次性将所有数据加载到内存中,而是按需生成数据。本文将深入讲解生成器的定义方式、核心机制、高级用法及注意事项,并附有实用的示例代码。
一、生成器的定义与原理
生成器是一种能够实现惰性计算、延迟执行和节省内存的迭代器。在 Python 中,通过 yield 语句实现生成器。
1. 基本概念
生成器中的函数不是直接返回一个值,而是返回一个生成器对象。取值时,通过 next() 方法或 for 循环操作获取生成器对象中的值。当生成器函数被调用时,它并不会立即执行函数体,而是返回一个生成器对象。只有当调用 next() 或进行迭代时,函数体才会开始执行,直到遇到 yield 语句暂停,保存当前状态,下次调用时从暂停处继续。
2. 生成器与迭代器的区别
迭代器(Iterator)是实现了迭代器协议的对象,即实现了 __iter__() 和 __next__() 方法。生成器是迭代器的一种特殊形式,它自动实现了这两个方法。所有的生成器都是迭代器,但并非所有的迭代器都是生成器。
二、生成器的使用场景
生成器特别适合处理大数据量和耗时操作的场景,例如遍历文件或网络数据流、CPU 密集型计算、图像处理等。
- 大文件处理:生成器可以逐个读取大文件,并且不必将整个文件加载到内存中,避免了内存消耗和 IO 操作的额外开销。
- 无限序列:生成器可以产生无限的数据流,例如斐波那契数列,而无需预先存储所有数据。
- 管道处理:在数据处理流水线中,生成器可以作为中间层,将上游产生的数据逐步传递给下游,减少中间缓冲区的内存占用。
三、如何定义生成器
生成器可以使用多种方式进行定义,包括通过函数、生成器类以及生成器表达式等。
1. 使用函数实现生成器
使用函数实现生成器是一种常见的方式,只需在函数中使用 yield 关键字即可。
def fib(max_count):
a, b = 0, 1
count = 0
while count < max_count:
yield a
a, b = b, a + b
count += 1
# 迭代输出前 10 个斐波那契数
for n in fib(10):
print(n, end=" ")
其中,使用 yield 语句实现惰性计算,返回一个生成器对象。在 for 循环中迭代生成器对象输出结果。
2. 使用生成器类实现生成器
使用生成器类可以实现更为复杂的生成器逻辑,例如在遍历数据库查询结果时,需要维护状态并返回多个字段。
class :
():
.items = []
.index =
():
.items.append(item)
():
:
.index >= (.items):
StopIteration
result = .items[.index]
.index +=
result
res = QueryResult()
res.add()
res.add()
item res.query():
(item)


