惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
腾讯CDC
M
MIT News - Artificial intelligence
Y
Y Combinator Blog
L
LangChain Blog
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
P
Proofpoint News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
IT之家
IT之家
A
About on SuperTechFans
H
Help Net Security

博客园 - androllen

PDF 构成 桌面客户端的主要类型和技术方案 Python 压缩转义 异步删除嵌套文件夹及文件 数据结构 二叉树遍历 数据结构 线性表 JS 字符串转换为函数体 VSCode 配置内部Python项目 缺少模块ModuleNotFoundError C# 基础知识 算法-数列 算法-排序算法 C# 设计模式-简单工厂模式 C# 设计模式 C# Utils .Net 异步与同步 WPF StreamGeometry Vue 打开窗口输出文件路径 CSS Flexbox layout 2 CSS Flexbox layout 1
Python yield 关键词
androllen · 2026-04-16 · via 博客园 - androllen

核心作用

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]