Loading

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]
posted @ 2026-04-16 12:18  androllen  阅读(10)  评论(0)    收藏  举报