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

推荐订阅源

Recent Announcements
Recent Announcements
J
Java Code Geeks
雷峰网
雷峰网
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
腾讯CDC
博客园 - 司徒正美
B
Blog RSS Feed
博客园 - 三生石上(FineUI控件)
I
InfoQ
N
Netflix TechBlog - Medium
L
LangChain Blog
博客园_首页
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
MyScale Blog
MyScale Blog
美团技术团队
The Cloudflare Blog
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
H
Help Net Security
Martin Fowler
Martin Fowler
V
Visual Studio Blog

博客园 - 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]