Python yield关键字
1、什么是yield关键字
yield
是 Python 中的一个关键字,它用于定义生成器函数。生成器是一种特殊的迭代器,它可以在遍历过程中逐步产生值,而不是一次性生成所有值并将其存储在内存中。这使得生成器非常适合处理大量数据或无限序列,因为它们只在需要时才生成下一个值,从而节省了内存。
当你在一个函数中使用 yield
语句时,这个函数就变成了一个生成器函数。调用生成器函数并不会立即执行其中的代码,而是返回一个生成器对象。当对这个生成器对象进行迭代(例如通过 for
循环或者调用 next()
函数)时,生成器函数会从上次暂停的地方继续执行,直到遇到下一个 yield
语句,然后返回当前的值,并再次暂停等待下一次迭代。
eg:斐波那契函数
def fibonacci(n):a, b = 0, 1for _ in range(n):yield aa, b = b, a + b# 使用生成器
for num in fibonacci(10):print(num)
在这个例子中,fibonacci
是一个生成器函数,它会生成前 n
个斐波那契数。每次迭代都会计算下一个斐波那契数,并通过 yield
返回该数值,而不占用额外的内存空间来存储整个序列。
2、使用方法
1、yield
单独使用
在这种情况下,yield
不返回任何值(实际上它会返回 None
)。这种方式通常用于创建一个简单的迭代器,当只需要控制流而不需要传递具体值时。
def simple_generator():yieldprint("After first yield")yieldprint("After second yield")gen = simple_generator()
next(gen) # 代码运行到第一个yield后停止,没有打印任何内容
next(gen) # 代码从第一个打印语句开始执行,然后遇到yield停止运行,打印第一个打印语句
next(gen) # 代码从第二个执行语句开始执行,打印第二个语句,但是没有了yield,报停止迭代异常
2、基本用法:返回值并暂停执行
这是最基础的用法,yield
可以用来代替 return
返回一个值给调用者,但是不会终止函数的执行。相反,它会保存函数的状态,并且可以在下次迭代时从中断的地方继续执行。
def simple_generator():yield 1yield 2yield 3if __name__ == '__main__':a = simple_generator()print(a.__next__())print(a.__next__())print(a.__next__())
依次打印1,2,3,每次调用生成一个值
如果调用的次数超过可迭代的次数,比如上述代码,再次调用
print(a.__next__()),会报StopIteration错误
3、yield
前边使用一个变量接收
yield
表达式可以出现在赋值语句的右侧,允许从外部向生成器发送数据。这通过 .send()
方法实现,发送的数据将作为 yield
表达式的结果被接收到。
def echo():while True:received = yieldprint(f"Received: {received}")e = echo()
next(e) # 必须先启动生成器
e.send('hello') # 输出:Received: hello
e.send('world') # 输出:Received: world
next(e),代码运行到yield这行后停止运行,然后调用send方法
相当于给received 赋值,然后执行打印语句,然后又执行到yiel语句停止
再次调用send方法,仍然是这样继续操作
在这个例子中,received
变量接收了从外部发送进来的值,并打印出来。需要注意的是,在第一次调用 .send()
方法之前,必须至少调用一次 next()
来启动生成器。
4、yield from
`yield from` 是 Python 中用于简化从子生成器中提取值的过程的一种语法。它使得你可以更方便地将一个生成器委托给另一个生成器,从而创建更复杂的迭代模式。使用 `yield from` 可以减少代码量,并且使代码更加清晰易读。
`yield from` 的基本含义
当你在一个生成器函数中使用 `yield from <iterable>` 时,Python 会自动迭代 `<iterable>`,并且对于每一个产生的值都会执行一次 `yield`。这相当于在每次迭代时都调用 `yield` 来返回当前的值给外部调用者。此外,`yield from` 还可以处理异常和发送值给子生成器,这对于实现协程非常有用。
使用场景
1. **简化嵌套循环**
2. **委派到子生成器**
3. **处理异常**
4. **发送值给子生成器**
示例说明
简化嵌套循环
假设你有一个包含多个列表的列表,你想一次性迭代所有元素:```python
def flatten(nested_list):for sublist in nested_list:for item in sublist:yield item# 使用 yield from 简化上面的代码
def flatten_with_yield_from(nested_list):for sublist in nested_list:yield from sublistnested = [[1, 2, 3], [4, 5], [6]]
for num in flatten_with_yield_from(nested):print(num)
委派到子生成器
如果你有一个复杂的迭代逻辑,可以将其拆分成几个子生成器,然后通过 `yield from` 将它们连接起来:
def generator_one():yield 'one'yield 'two'def generator_two():yield 'three'yield 'four'def combined_generator():yield from generator_one()yield from generator_two()for value in combined_generator():print(value)
输出将是:
```
one
two
three
four
```
处理异常
`yield from` 也可以传递异常给子生成器:
def subgen():try:while True:x = yieldprint(f"Received: {x}")except GeneratorExit:print("Sub-generator is closing")def delegator():yield from subgen()g = delegator()
next(g) # 启动生成器
g.send('hello')
g.close() # 关闭生成器,触发 GeneratorExit 异常
发送值给子生成器
除了传递异常,`yield from` 还可以让主生成器向子生成器发送值:```python
def subgen():while True:x = yieldprint(f"Sub-generator received: {x}")def delegator():sg = subgen()next(sg) # 启动子生成器yield from sgg = delegator()
next(g) # 启动主生成器
g.send('hello') # 发送值给子生成器
关键区别
-
层次结构:
yield
通常用于定义单层生成器逻辑。yield from
用于委派到子生成器,可以简化多层迭代逻辑。
-
代码简化:
- 使用
yield
时,如果需要遍历一个可迭代对象,你必须显式地写出循环来逐一yield
每个元素。 yield from
自动完成这一过程,使得代码更加简洁明了。
- 使用
-
双向通信:
yield
只能直接与调用者交互。yield from
支持主生成器与子生成器之间的双向通信,包括发送值和抛出异常。
-
异常处理:
yield
需要在主生成器中手动处理异常。yield from
自动处理并传播异常给子生成器,允许更复杂的错误管理。
相关文章:
Python yield关键字
1、什么是yield关键字 yield 是 Python 中的一个关键字,它用于定义生成器函数。生成器是一种特殊的迭代器,它可以在遍历过程中逐步产生值,而不是一次性生成所有值并将其存储在内存中。这使得生成器非常适合处理大量数据或无限序列࿰…...
tomcat的Mysql链接字符串问题
tomcat配置mysql链接需要改server.xml或content.xml。 但是server.xml或content.xml中mysql的配置看起来很古怪: url"jdbc:mysql://10.21.0.6:3306/hrdatabase?characterEncodinggbk&autoReconnecttrue" 而使用springboot开发java应用,使用ya…...

聊聊JVM G1(Garbage First)垃圾收集器
CMS的垃圾回收机制,为什么分为四步https://blog.csdn.net/genffe880915/article/details/144205658说完CMS垃圾回收器,必定要说到目前一般应用项目中都推荐的G1。G1在JDK1.7 update4时引入,在JDK9时取代CMS成为默认的垃圾收集器。它是HotSpot…...

【论文复现】隐式神经网络实现低光照图像增强
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢? 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…...

Python知识分享第十九天-网络编程
网络编程 概述用来实现 网络互联 不同计算机上运行的程序间可以进行数据交互也叫Socket编程 套接字编程 三要素IP地址概述设备在网络中的唯一标识分类IPV4城域网13广域网22局域网31IPV6八字节 十六进制相关dos命令查看ipwindows: ipconfigmac和linux: ifconfig测试网络ping 域…...
C# 绘制GDI红绿灯控件
C# 绘制GDI红绿灯控件 using System; using System.Windows.Forms; using System.Drawing;public class TrafficLightControl : Control {protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g e.Graphics;g.SmoothingMode System.Drawing.Drawin…...
Centos 8 服务器时间校正
Centos 8 服务器时间校正 使用chrony服务自动同步时间: 1.安装chrony: sudo dnf install chrony 2.启动并使chrony服务自动启动: sudo systemctl start chronyd sudo systemctl enable chronyd 3.添加配置置文件/etc/chrony.conf指向了可靠…...

模型 正则化方法(通俗解读)
系列文章 分享 模型,了解更多👉 模型_思维模型目录。控制模型复杂度,防过拟合。 1 正则化方法的应用 1.1 正则化方法在教育领域的应用案例 - 重塑教学模式 背景: 在教育领域,正则化方法可以被理解为对教学模式和学习…...
ffmpeg命令
ffmpeg是专门处理多媒体文件(包括音频、视频)的命令; ffplay 是 ffmpeg 软件包中的一个命令行多媒体播放器,它主要用于播放音视频文件; # fmpeg命令转换格式,将mp3格式转换为wav格式 ffmpeg -i input.mp3…...
使用 EasyExcel 实现高效的 Excel 读写操作
在日常开发中,Excel 文件的读写操作是一个常见的需求。EasyExcel 是阿里巴巴开源的一个高性能、易用的 Excel 读写库,可以大幅提高处理 Excel 文件的效率。它通过事件驱动模型优化了大数据量 Excel 的读写性能,非常适合处理大文件或高并发场景…...

数据结构(栈Stack)
1.前言: 在计算机科学中,栈(Stack)是一种基础而存在的数据结构,它的核心特性是后进先出(LIFO,Last In, First Out)。想象一下,在现实生活中我们如何处理一堆托盘——我们…...

Windows 11 环境下 条码阅读器输入到记事本的内容不完整
使用Windows11时,为什么记事本应用程序中的扫描数据被截断或不完整?为什么sdo 特殊字符的显示与Windows 10 记事本应用程序不同? 很多人认为和中文输入法有关,其实主要问题出在这个windows11下的记事本程序上,大家知道这个就可以了&#x…...

【串口助手开发】visual studio 使用C#开发串口助手,生成在其他电脑上可执行文件,可运行的程序
1、改成Release,生成解决方案 串口助手调试成功后,将Debug改为Release,点击生成解决方案 2、运行exe文件 生成解决方案后,在bin文件夹下, Release文件夹下,生成相关文件 复制一整个Release文件夹…...

Redis设计与实现读书笔记
Redis设计与实现读书笔记 Redis设计与实现[^1]简单动态字符串SDS的基础定义与C字符串的差别常数获取长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数二进制安全函数兼容 链表链表和链表节点的实现 字典字典的实现哈希表定义哈希表节点定义字典定义 哈希算法解决键冲突…...
UE5 Do Once 节点
在 Unreal Engine 5 (UE5) 中,Do Once 节点是一个蓝图节点,用于确保某个操作或代码只执行一次,直到某些条件被重置。它通常用于处理需要执行一次的逻辑,例如初始化、事件触发、或防止重复执行某些操作。 如何使用 Do Once 节点&a…...
javascript(前端)作为客户端端通过grpc与cpp(服务端)交互
参考文章 https://blog.csdn.net/pathfinder1987/article/details/129188540 https://blog.csdn.net/qq_45634989/article/details/128151766 前言 临时让我写前端, 一些配置不太懂, 可能文章有多余的步骤但是好歹能跑起来吧 你需要提前准备 公司有自带的这些, 但是版本大都…...

前端常用缓存技术深度剖析
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
Asp.net Mvc在VSCore中如何将增删改查的增改添加数据传输到页面(需配合上一篇Mvc的增删改查一起)
Linq集成查询(关联Lambda) First FirstOrDefault 找到第一个符合条件的元素 First(x >x.Id id) 返回第一个Id等于id的元素,如果都没有符合的,报错FirstOrDefault(x >x.Id id) 返回第一个Id等于id的元素,如果…...

Android显示系统(04)- OpenGL ES - Shader绘制三角形
一、前言: OpenGL 1.0采用固定管线,OpenGL 2.0以上版本重要的改变就是采用了可编程管线,Shader 编程是指使用着色器(Shader)编写代码来控制图形渲染管线中特定阶段的处理过程。在图形渲染中,着色器是在 GP…...

微信 创建小程序码-有数量限制
获取小程序码:小程序码为圆图,有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...