生成器函数

4 阅读2分钟

Python中的生成器

生成器是一种特殊的迭代器,它允许你按需生成值,而不是一次性把所有值都存储在内存中。生成器使用 yield 关键字而不是 return,每次 yield 会暂停函数的执行状态,并在下次调用时从暂停处继续。

核心特点

  1. 惰性求值:只在需要时生成下一个值,不预先计算所有结果。
  2. 内存高效:适合处理大数据流或无限序列,因为它一次只保存一个值。
  3. 可迭代:生成器对象可以直接用在 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 实现“流式处理”和“协程”的基础工具,理解它对写出高效、优雅的代码很有帮助。