目录
1. 什么是生成器?
生成器是一种特殊的迭代器,它使用yield
关键字而不是return
来返回值。生成器函数在每次调用next()
时执行,直到遇到yield
语句暂停并返回一个值,下次调用时从暂停的位置继续执行。
2. 关键字 yield
yield
关键字用于定义生成器函数:
def my_generator():
yield 1
yield 2
yield 3
# 创建生成器对象
gen = my_generator()
# 使用生成器
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
3. 生成器表达式
类似于列表推导式,但使用圆括号:
# 列表推导式 - 立即计算
squares_list = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]
# 生成器表达式 - 延迟计算
squares_gen = (x**2 for x in range(5)) # 生成器对象
print(list(squares_gen)) # 转换为列表: [0, 1, 4, 9, 16]
4. 使用场景
-
处理大数据集(节省内存)
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_file.txt'): process(line)
-
无限序列
def infinite_sequence(): num = 0 while True: yield num num += 1 # 生成无限序列 for i in infinite_sequence(): if i > 100: # 需要手动终止 break print(i)
-
管道数据处理(链式处理)
def gen_numbers(): for i in range(10): yield i def gen_squares(nums): for num in nums: yield num**2 # 链式处理 squares = gen_squares(gen_numbers()) print(list(squares)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
-
状态保持(比类更简洁)
def counter(start=0): count = start while True: val = (yield count) if val is not None: # 可以通过send()修改状态 count = val else: count += 1 c = counter(10) print(next(c)) # 10 print(next(c)) # 11 c.send(20) # 修改状态 print(next(c)) # 21
-
协程和异步编程(基础)
def coroutine(): print("Starting") while True: value = (yield) print(f"Received: {value}") co = coroutine() next(co) # 启动协程 co.send("Hello") # Received: Hello co.send("World") # Received: World
5. 生成器 vs 迭代器
特性 | 生成器 | 迭代器 |
---|---|---|
实现方式 | 使用yield 的函数 | 实现__iter__ 和__next__ 的类 |
内存使用 | 更节省内存 | 相对占用更多内存 |
代码简洁性 | 更简洁 | 需要更多代码 |
状态保持 | 自动保存局部变量状态 | 需要手动管理状态 |
生成器是Python中非常强大的工具,特别适合处理大数据流、实现惰性计算和创建复杂的迭代模式。