当前位置: 首页 > news >正文

yield在Python中的应用

yield 在 Python 中的核心作用是创建生成器(generator),而“流式输出”是生成器的典型应用场景之一,但并非 yield 的唯一用途。要理解 yield,需要先明确它的本质:

1. yield 的核心功能:创建生成器,实现“惰性计算”

当一个函数包含 yield 关键字时,它就不再是普通函数,而是生成器函数。调用生成器函数时,不会立即执行函数体,而是返回一个生成器对象。每次通过 next() 函数或迭代(for 循环)获取值时,函数会执行到 yield 处暂停,返回 yield 后的值,下次迭代时从暂停处继续执行。

这种“暂停-恢复”的特性,让生成器可以按需产生数据(而不是一次性生成所有数据),即“惰性计算”。这带来两个核心优势:

  • 节省内存:无需在内存中存储完整的数据集(比如处理百万级数据时,不必一次性加载到列表)。
  • 支持流式处理:可以边生成、边处理、边输出,适合实时数据场景。

2. “流式输出”是 yield 的典型应用,但不是全部

“流式输出”(比如逐个产生数据并实时处理)是生成器的常见用法,因为 yield 可以一次次返回单个数据,而不是等待所有数据生成后再返回。

例如,你的代码中:

async def _extract_country_names_streaming(input_stream):country_names_so_far = set()async for input in input_stream:# ... 处理逻辑 ...if name not in country_names_so_far:yield name  # 每次产生一个国家名称,实现流式输出country_names_so_far.add(name)

这里的 yield name 就是在“流式输出”——每提取到一个新国家,就立刻返回这个名称,而不是等所有国家都提取完再一次性返回列表。

3. yield 的其他重要用途

除了流式输出,yield 还有其他关键作用:

(1)处理大数据集(内存优化)

例如,生成100万个数字时,用列表会占用大量内存,而生成器则按需产生:

def generate_large_numbers(n):for i in range(n):yield i  # 每次只生成一个数字,内存占用极低# 迭代生成器,处理100万个数字,内存不会爆炸
for num in generate_large_numbers(1_000_000):process(num)  # 边生成边处理
(2)实现无限序列

生成器可以表示无限数据(因为不需要一次性存储),例如生成所有奇数:

def infinite_odds():n = 1while True:yield nn += 2# 迭代时可以按需取前N个
odds = infinite_odds()
for _ in range(5):print(next(odds))  # 输出:1, 3, 5, 7, 9
(3)在协程中作为“通信机制”(Python 3.3+)

yield 还可以在协程中用于接收数据(配合 send() 方法),实现函数间的双向通信:

def coroutine_example():while True:received = yield  # 接收外部发送的数据print(f"收到:{received}")c = coroutine_example()
next(c)  # 启动协程
c.send("hello")  # 输出:收到:hello
c.send("world")  # 输出:收到:world

总结

yield 的核心是创建生成器,实现“惰性计算”(按需产生数据)。而“流式输出”是这种特性的典型应用——因为生成器可以逐个返回数据,天然适合边生成边输出的场景。但 yield 的作用不止于此,它还能优化内存使用、表示无限序列、实现协程通信等。

简单说:yield 是生成器的“开关”,流式输出是生成器的常见用法之一

http://www.dtcms.com/a/410033.html

相关文章:

  • Linux配置Java/JDK(解决Kali启动ysoserial.jar JRMPListener报错)暨 Kali安装JAVA8和切换JDK版本的详细过程
  • springboot用jar启动能访问,但是打成war,部署到tomcat却访问不到
  • 免费企业网站建设流程华为公司电子商务网站建设策划书
  • 中国网站备案查询系统东莞seo外包公司哪家好
  • STM32H743-ARM例程6-RS422
  • 倾角传感器厂家为物联网应用提供高效双轴监测解决方案
  • 住宅IP vs 数据中心IP 2025实战性能对决:IPIPGO、天启HTTP、光络云深度横评
  • 成都网站seo公司wordpress页面视频播放
  • EasyClick JavaScript正则表达式匹配规则
  • 盟接之桥说制造:“首件手板”商业模式:制造业的下一个黄金赛道,你的公司准备好了吗?
  • mysql怎么安装,新手安装MySQL后如何安全备份不踩坑?
  • 【Git】分⽀管理
  • 半导体制造常见分析仪器之高分辨率 3D X 射线显微镜
  • PCB 半固化片:多层板制造的技术基石,猎板的场景化适配与质控逻辑
  • 番禺网站设计与制作广州海佳网络网站建设公司怎么样
  • Spring Cloud 负载均衡(LoadBalancer)与服务调用(OpenFeign)详解
  • 基于HTTP构建局域网内YUM网络源:详细操作指南(太细)
  • Java核心 之JVM
  • 通过 GAC Code 在国内使用ClaudeCode,Windows 用户配置指南!
  • iOS App 上架流程详解,苹果应用发布步骤、App Store 审核规则、ipa 文件上传与测试分发实战经验
  • 线程安全之《Sychronized的八锁案例》
  • 用户态的epoll实现思路?
  • TextMeshPro文字消失bug解决方案
  • 学习网站开发教程wordpress 五分钟
  • 联邦学习中的异质性问题
  • 将照片从iPhone传输到联想笔记本的6种方法
  • 东莞网站设计找哪里易商官方网站
  • 本机可以做网站的服务器互联斗士网站建站
  • 基于 GitLab 的自动化镜像构建
  • Spark核心Shuffle详解(一)ShuffleManager