问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

一文搞懂Python中的yield

发布网友 发布时间:2024-10-08 09:26

我来回答

1个回答

热心网友 时间:2024-10-08 09:55

yield 关键字在 Python 中有着重要的作用,既可以实现生成器,也可以实现协程。生成器和协程的概念可能对于初学者来说比较抽象,但理解它们的作用和效果是至关重要的。

首先,我们来看看 yield 的英文单词的意思。yield 在英语中的意思是“出产(作物);产生(收益、效益等);提供”。这个词语的含义可以帮助我们更好地理解 yield 在 Python 中的作用。

在初学 Python 的时候,我对于 yield 关键字的认知仅仅停留在它是一种特殊的 return,能够理解其用法即可。自己很少使用,也就没有深入研究过。然而,当我需要处理大量数据,数据的大小甚至超过了电脑的可用内存时,我开始重新审视 yield 的作用。

比如,在操作 db2 数据库查询数据时,当数据结果很大时,我不想一次性将所有数据读入内存,这时我会使用 yield 关键字来返回一行数据,程序处理完后,再取下一行。这种做法可以有效地节省内存空间。

关键字 yield 的用法是,它返回了一个值,但程序并未退出,下一次从 yield 后面的代码继续运行,直到后面没有代码,结束运行。下面我们通过一个简单的例子来看一下其效果:

通过上面的例子,我们可以发现,yield 关键字自动为我们生成了私有方法 __next__,这样就不会将所有数据取出来存入内存中,用多少取多少,可以节省内存空间。

除了节省内存空间外,yield 在数据量较大时,执行速度也会提升。在 Ipython 终端中执行上述代码,我们可以看到使用 yield 的函数执行速度更快。

yield 是自己实现一个生成器最便捷的方式。Python 语言的生成器是最有用的特性之一,但使用不广泛。我曾问过周围使用 Java 的朋友是否有类似的特性,他们回答说没有,网上搜了一下,确实主流的编程语言都没有。因此,Python 的生成器特性没有引起其他语言转 Python 的工程师的关注。

生成器非常有用,尤其是在处理大量数据时。当你需要处理的数据大小超过你电脑的可用内存时,生成器的懒加载(用的时候才读入内存)就非常有效。

比如,在读取文件时,如果你一次性读取很大的文件,可能会让内存一下子就满了。推荐的做法是使用文件本身的生成器,这样读多大的文件,也不会撑爆内存。

想深入学习生成器、迭代器、可迭代对象,可以看我以前的推文:《python 基础系列--可迭代对象、迭代器与生成器》、《深入理解迭代器和生成器》。

yield 关键字还可以实现协程。虽然现在有 asyncio 和 await 关键字来方便地实现协程,但在之前,实现协程就靠的是 yield。

yield 有一个 send 方法,可以改变 yield 的返回值。下面是一个示例代码:

第一次执行 x 的 next 方法时,函数执行到第一个 yield 处,打印了 a 返回了值 1,此时变量 a 并未获取到 yield 的返回值,a 为 None。当执行 x.send(4) 时,a 才获取到值 4,程序运行到第二个 yield 处,后续过程也是一样。

利用这一特性,我们可以和被调用的函数通信,进而可以实现一个生产者消费者模型。下面是示例代码和运行结果:

运行结果如下:

produce 和 consume 函数在一个线程内执行,通过调用 send 方法和 yield 互相切换,实现协程的功能。

关于协程的学习,可以看我以前的推文:《协程学习笔记》、《并发时用多线程还是协程?》。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
艾芙洛洗发水为什么不在商场销售商 艾芙洛洗发水是英国的吗 毕业生刚刚签了三方协议,想毁,怎么办 适合夫妻干的生意有哪些 新生蜜蜂多久出巢试飞 新生蜜蜂什么时候进行首次试飞? 蜜蜂几月几日出生外貌和颜色? 当脚模一定要脚趾修长吗 脚长成这样,能当脚膜吗 固话遇忙记存呼叫业务有什么特点? 什么是固话遇忙记存呼叫业务? Python中的yield关键字 国家外汇管理局是干什么 外汇交易所是做什么的 芙莱佳家具是原创设计师家居品牌吗? 国汇是什么 品牌分享丨GOSUN高晟家居——原创设计家具品牌 农村合作医疗报销 我家是湖北孝感的,去年年底发现我妈妈病了,在本市... 湖北省孝感市新型农村合作医疗办了的,还可以办社保或医报吗?分别是多少... 我孝感闵集的,办了农村合作医疗,但没发我卡,每年都交费了,是怎么了, 眼袋真的很显老,给你祛除眼袋的三个理由! 在孝感住院费用能拿回云梦农村合作医疗报销吗 湖北孝感农村合作医疗证如何办理 leo场景是什么意思? 运载火箭所谓的leo轨道具体是多高的轨道高度? 买鞋子leo什么意思 淘宝卖家信用三心变二心,是怎么回事? 我是和建筑今年的毕业生,准备从事弱电的设计工作,但是很欠缺这方面的... 如何成为弱电设计师?要学习哪些知识RVV2*0.75 我想干弱电工作 我应该要掌握什么技术呀 跪求 什么都不懂的我怎样才能胜任弱电设计工作,从什么开始学习 Python中的yield 如果户口本丢了怎么补办? C盘的空间快满了 有必要处理一下么 ? C盘空间满了会出现什么情况 ai里面怎么做变形ai怎么变形状 2.lllustrator2020中的___工具组能够使对象产生特殊的变形效果? 在Illustrator中“扭曲”工具在什么地方,最好画图表示 中山陵景区简介 Illustrator基础教程解析扭曲功能中的变换效果 变形工具Illustrator变形工具 IllustratorCS5教程实例解析应用封套命令 网上怎么申请光大银行信用卡?具体步骤是什么样的?需要哪些条件? 申请光大银行的信用卡需要什么条件? 牧神星发现 牧神星物理资料 牧神星轨道根数 烦请各位介绍一下魔羯座 学科类型都有什么 学科类型有哪些特点 ...我姓罗,我们给孩子取名字想把我们的姓都带着,是女孩,大家帮忙取个...