在 Python 中,生成器(Generator)是一种特殊的迭代器,用于以惰性方式生成序列数据。与一次性将所有数据加载到内存的列表不同,生成器按需生成数据,大大节省内存开销。本文将深入解析生成器的工作原理和用法。
- 什么是生成器?
生成器本质上是一个返回迭代器的函数,使用 yield 关键字而不是 return。每次调用生成器的 next() 方法(或通过 next() 函数),函数会暂停并返回一个值,继续运行时从暂停的地方恢复。
- 定义生成器
生成器使用简单的函数定义:
def my_generator():
yield 1
yield 2
yield 3
使用生成器:
gen = my_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
- 使用场景
- 替代列表,节省内存
普通列表
squares = [x**2 for x in range(1000000)]
生成器
squares_gen = (x**2 for x in range(1000000))
生成器表达式 (x**2 for x in range(1000000)) 仅在需要时生成值,而不会一次性占用内存。
- 大文件逐行读取
def read_large_file(file_path):
with open(file_path, ‘r’) as file:
for line in file:
yield line.strip()
使用生成器逐行处理文件
for line in read_large_file(“large_file.txt”):
print(line)
- 无限序列
def infinite_sequence():
num = 0
while True:
yield num
num += 1
gen = infinite_sequence()
print(next(gen)) # 0
print(next(gen)) # 1
- yield 的高级用法
- 双向通信
def generator():
value = yield “Start”
yield f"Received: {value}"
gen = generator()
print(next(gen)) # Start
print(gen.send(“Hello”)) # Received: Hello
-
生成器的关闭
可以通过 gen.close() 主动关闭生成器,或使用 try…finally 确保生成器正常结束。 -
生成器 vs 列表
特性 生成器 列表
内存占用 按需生成,内存小 全部加载,占用大
迭代方式 一次性,不能回溯 可随机访问元素
使用场景 数据流、无限序列 小数据集
总结
生成器是 Python 中处理大数据和流式数据的强大工具。它以高效、优雅的方式处理数据流,特别适合内存有限或数据规模未知的场景。通过合理使用生成器,你的代码将更加高效和灵活!