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 功能描述 …...

重生之我在异世界学编程之C语言:操作符篇
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文1. 算术操作符2. 关系࿰…...

365天深度学习训练营-第P7周:马铃薯病害识别(VGG-16复现)
文为「365天深度学习训练营」内部文章 参考本文所写记录性文章,请在文章开头带上「👉声明」 🍺 要求: 自己搭建VGG-16网络框架【达成√】调用官方的VGG-16网络框架【达成√】如何查看模型的参数量以及相关指标【达成√】 &#…...

解密时序数据库的未来:TDengine Open Day技术沙龙精彩回顾
在数字化时代,开源已成为推动技术创新和知识共享的核心力量,尤其在数据领域,开源技术的涌现不仅促进了行业的快速发展,也让更多的开发者和技术爱好者得以参与其中。随着物联网、工业互联网等技术的广泛应用,时序数据库…...

Kubernetes 告警标签规范与最佳实践
1. 前言 在现代化的 Kubernetes 运维环境中,规范的告警标签系统对于快速定位和解决问题至关重要。本文将详细介绍告警标签的设计规范和最佳实践,帮助团队建立高效的告警处理流程。 © ivwdcwso (ID: u012172506) 2. 标签体系设计 2.1 基本概念 告警标签(Labels)是一…...

前端开发 之 15个页面加载特效中【附完整源码】
前端开发 之 15个页面加载特效中【附完整源码】 文章目录 前端开发 之 15个页面加载特效中【附完整源码】八:圆环百分比加载特效1.效果展示2.HTML完整代码 九:毒药罐加载特效1.效果展示2.HTML完整代码 十:无限圆环加载特效1.效果展示2.HTML完…...

rsync+nfs+lrsync服务部署流程
rsyncnfslrsync服务 主机信息 主机角色外网IP内网IP主机名nfs、lsync10.0.0.31176.16.1.31nfs客户端10.0.0.7176.16.1.7web01rsync、nfs10.0.0.41172.16.1.41backup 部署流程 1.backup服务器部署rsync --下载rsync服务 [rootbackup ~]# yum install -y rsync --配置rsync服…...

基于SpringBoot+Vue的宠物咖啡馆系统-无偿分享 (附源码+LW+调试)
目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 研究目的 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 概述 7.2 系统流程和逻辑 7.3 系统结构 8. 数据库设计 8.1 数据库ER图 (1)宠物订…...

SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2
Caused by: javax.net.ssl.SSLHandshakeException: the server selected protocol version TLS10 is not accepted by client preferences [TLS12] 原因描述:SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2 解决方法如下: 打开文件…...

Golang内存模型总结1(mspan、mcache、mcentral、mheap)
1.内存模型 1.1 操作系统存储模型 从上到下分别是寄存器、高速缓存、内存、磁盘,其中越往上速度越快,空间越小,价格越高。 关键词是多级模型和动态切换 1.2 虚拟内存与物理内存 虚拟内存是一种内存管理技术,允许计算机使用比…...

lobeChat安装
一、安装Node.js version > v18.17.0 二、下载 cd F:\AITOOLS\LobeChat git clone https://github.com/lobehub/lobe-chat.git (下载要是失败就手动下:https://codeload.github.com/lobehub/lobe-chat/zip/refs/heads/main) npm install …...