Python yield 关键词
核心作用
1. 暂停与恢复函数执行
def count_up_to(n):
i = 1
while i <= n:
yield i # 暂停在这里,返回当前值
i += 1
# 调用
for num in count_up_to(3):
print(num) # 输出:1, 2, 3
2. 惰性求值(Lazy Evaluation)
不像 return 立即返回所有结果
yield 按需产生值,节省内存
# 使用列表 - 一次性占用全部内存
data = [i * 2 for i in range(1000000)]
# 使用生成器 - 逐个产生值
def data():
for i in range(1000000):
yield i * 2
# 内存友好!
3. 在流式响应中的应用
async def story_generator():
async for chunk in generate_story_stream(query):
yield chunk # 每收到一段数据就发送给前端
return StreamingResponse(
story_generator(),
media_type="text/event-stream"
)
这里 yield 让后端能够:
- 边计算边发送 - 不需要等故事完全生成
- 实时推送 - 前端可以边接收边渲染
- 保持连接 - SSE 持续传输数据流
yield vs return
| 特性 | return | yield |
|---|---|---|
| 返回值 | 一次返回,函数结束 | 多次返回,函数暂停 |
| 状态保留 | 不保留 | 保留局部变量状态 |
| 使用场景 | 普通函数 | 生成器/协程 |
实际例子
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
# 生成前 10 个斐波那契数
list(fibonacci(10)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

浙公网安备 33010602011771号