1. 基本概念
- 生成器是一种特殊的迭代器
- 使用yield替代return
- 按需生成值,节省内存
2. 创建生成器的两种方式
方式一:生成器函数(使用yield)
def my_generator():
yield 1
yield 2
yield 3
方式二:生成器表达式
# 类似列表推导式,但使用圆括号
g = (x*x for x in range(10))
3. 生成器的关键方法
# 创建生成器
def count_generator(n):
for i in range(n):
yield i
# 使用方法
g = count_generator(5)
# 获取值的三种方式
print(next(g)) # 逐个获取
print(list(g)) # 转换为列表
for value in g: # 迭代
print(value)
5、send的基本原理:
工作原理
- 双向通信:yield不仅可以向外部返回值,还可以接收外部发送的值
- 表达式赋值:yield作为表达式右侧时,可以接收send()传入的值
- 状态保持:生成器会记住上次执行位置,send()后从那里继续执行
# 基本语法
value = yield expression
这行代码做了两件事:
- 向外部返回expression的值
- 等待外部通过send()发送值,并赋给value
代码解刨:
def echo_generator():
# 初始化输出值
output_value = None
while True:
# yield右侧:返回output_value给外部调用者
# yield左侧:接收外部send()的值并赋给input_value
input_value = yield output_value
# 将接收到的值赋给output_value,准备下次yield返回
output_value = input_value
# 可以对接收的值进行处理
if input_value == "exit":
return "生成器结束"
print(f"生成器内部收到: {input_value}")
# 创建生成器
g = echo_generator()
# 预激生成器(必须步骤)
first_result = next(g) # 执行到第一个yield并暂停
print(f"预激结果: {first_result}") # None
# 发送数据并获取返回值
print(f"第一次send结果: {g.send('你好')}") # 发送"你好"并获取返回值
print(f"第二次send结果: {g.send('世界')}") # 发送"世界"并获取返回值
# 发送退出信号
try:
print(g.send("exit"))
except StopIteration as e:
print(f"捕获到返回值: {e.value}")
调用链:
"""
外部调用 生成器内部
--------- ---------
next(g) ------> yield output_value (初始为None)
<------ 返回None
g.send("你好") ------> input_value = "你好"
output_value = input_value
处理input_value
<------ yield返回output_value("你好")
g.send("世界") ------> input_value = "世界"
output_value = input_value
处理input_value
<------ yield返回output_value("世界")
"""
打印结果:
预激结果: None
生成器内部收到: 你好
第一次send结果: 你好
生成器内部收到: 世界
第二次send结果: 世界
捕获到返回值: 生成器结束