Python yield 用法

Python yield 用法

http://www.pythonclub.org/python-basic/yield

yield 用法说明

yield 简单说来就是一个生成器,生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

  • 生成器 是 一个函数

函数的所有参数都会保留

  • 第二次调用 此函数 时

使用的参数是前一次保留下的.

  • 生成器还“记住”了它在流控制构造

生成器不仅“记住”了它数据状态。 生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。

yield 生成器的运行机制

当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行。 当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复直至退出函数。

 

 

 http://developer.51cto.com/art/201003/186451.htm

Python编程语言作为一款比较新的程序应用语言,其中有很多方法是开发人员需要慢慢熟练掌握的。比如今天为大家介绍的Python yield就是一个比较特殊的应用。yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白Python yield的用法。只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子:


  
  1. def addlist(alist):  
  2. for i in alist:  
  3. yield i + 1 

取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项:


  
  1. alist = [1, 2, 3, 4]  
  2. for x in addlist(alist):  
  3. print x, 

这的确是Python yield应用的一个例子,但是,看过limodou的文章《2.5版yield之学习心得》,并自己反复体验后,对yield有了一个全新的理解。

1. 包含yield的函数

假如你看到某个函数包含了yield,这意味着这个函数已经是一个Generator,它的执行会和其他普通的函数有很多不同。比如下面的简单的函数:


  
  1. def h():  
  2. print 'To be brave'  
  3. yield 5  
  4. h() 

可以看到,调用h()之后,print 语句并没有执行!这就是yield,那么,如何让print 语句执行呢?这就是后面要讨论的问题,通过后面的讨论和学习,就会明白yield的工作原理了。

2. yield是一个表达式

Python2.5以前,Python yield是一个语句,但现在2.5中,yield是一个表达式(Expression),比如:


  
  1. m = yield 5 

表达式(yield 5)的返回值将赋值给m,所以,认为 m = 5 是错误的。那么如何获取(yield 5)的返回值呢?需要用到后面要介绍的send(msg)方法。

3. 透过next()语句看原理

现在,我们来揭晓yield的工作原理。我们知道,我们上面的h()被调用后并没有执行,因为它有yield表达式,因此,我们通过next()语句让它执行。next()语句将恢复Generator执行,并直到下一个yield表达式处。比如:


  
  1. def h():  
  2. print 'Wen Chuan'  
  3. yield 5  
  4. print 'Fighting!'  
  5. c = h()  
  6. c.next()c.next() 

调用后,h()开始执行,直到遇到yield 5,因此输出结果:


  
  1. Wen Chuan 

当我们再次调用c.next()时,会继续执行,直到找到下一个yield表达式。由于后面没有Python yield了,因此会拋出异常:


  
  1. Wen Chuan  
  2. Fighting!  
  3. Traceback (most recent call last):  
  4. File "/home/evergreen/Codes/yidld.py", line 11, in <module> 
  5. c.next()  
  6. StopIteration 

4. send(msg) 与 next()

了解了next()如何让包含yield的函数执行后,我们再来看另外一个非常重要的函数send(msg)。其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。来看这个例子:


  
  1. def h():  
  2. print 'Wen Chuan',  
  3. m = yield 5 # Fighting!  
  4. print m  
  5. d = yield 12  
  6. print 'We are together!'  
  7. c = h()  
  8. c.next() #相当于c.send(None)  
  9. c.send('Fighting!') #(yield 5)表达式被赋予了'Fighting!'输出的结果为:  
  10. Wen Chuan Fighting! 

需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有Python yield语句来接收这个值。

5. send(msg) 与 next()的返回值

send(msg) 和 next()是有返回值的,它们的返回值很特殊,返回的是下一个yield表达式的参数。比如yield 5,则返回 5 。到这里,是不是明白了一些什么东西?本文第一个例子中,通过for i in alist 遍历 Generator,其实是每次都调用了alist.Next(),而每次alist.Next()的返回值正是yield的参数,即我们开始认为被压进去的东东。我们再延续上面的例子:


  
  1. def h():  
  2. print 'Wen Chuan',  
  3. m = yield 5 # Fighting!  
  4. print m  
  5. d = yield 12  
  6. print 'We are together!'  
  7. c = h()  
  8. m = c.next() #m 获取了yield 5 的参数值 5  
  9. d = c.send('Fighting!') #d 获取了yield 12 的参数值12  
  10. print 'We will never forget the date', m, '.', d输出结果:  
  11. Wen Chuan Fighting!  
  12. We will never forget the date 5 . 12 

6. throw() 与 close()中断 Generator

中断Generator是一个非常灵活的技巧,可以通过throw抛出一个GeneratorExit异常来终止Generator。Close()方法作用是一样的,其实内部它是调用了throw(GeneratorExit)的。我们看:


  
  1. def close(self):  
  2. try:  
  3. self.throw(GeneratorExit)  
  4. except (GeneratorExit, StopIteration):  
  5. pass  
  6. else:  
  7. raise RuntimeError("generator ignored GeneratorExit")  
  8. # Other exceptions are not caught 

因此,当我们调用了close()方法后,再调用next()或是send(msg)的话会抛出一个异常:


  
  1. Traceback (most recent call last):  
  2. File "/home/evergreen/Codes/yidld.py", line 14, in <module> 
  3. d = c.send('Fighting!') #d 获取了yield 12 的参数值12  
  4. StopIteration 

以上就是我们对Python yield的相关介绍。

【Python】一篇文章读懂yield基本用法 一个例子搞定 yield 机制 阅读详情

相关推荐

STM32H743IIT6上LVGL移植实战:从零到触摸屏驱动的完整配置流程

本文详细记录了在STM32H743IIT6高性能MCU上,从零开始移植LVGL图形库到7寸RGB触摸屏的完整实战流程。内容涵盖工程搭建、显示与触摸驱动配置、LVGL核心优化及常见问题排查,重点讲解了如何利用STM32H743的硬件特性(如DMA2D、LTDC)提升GUI性能,为嵌入式GUI开发提供了一份详实的配置指南。

spark7igniter的博客 549

yield()函数的使用

yield函数在并发编程中是非常重要的一个概念,尤其在多核计算机还不是那么普及的年代,要完成一个“并发”程序,是不得不借助yield函数的。 我们知道,yield的意思是“屈服、礼让”,在程序中表现为当前线程会尽量让出CPU资源来给其他线程执行,但是yield函数背后究竟发生了什么呢,我们结合线程、栈来说明函数背后是如何执行,程序是如何配合CPU来完成yield函数的。首先我们来看一个例子,100

ztliduo的博客 1万+

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 109

C语言线程Yield,C++11多线程-主动让出CPU使用权(yield)

在多线程的编程中,有时候一个线程需要等待IO操作或者等待其它某个条件满足,再继续执行。为了达到这样的目的,有时我们会写出如下的代码:while(!isDone()); // Bad这样代码的问题在于,这个循环判断的操作会使得这个线程占满CPU的时间,造成资源的浪费。我们可以在一次判断结束后,让线程主动让出自己对CPU的使用权,让操作系统调度另一线程继续执行,过一会再回来判断操作是否完成,这样使得该...

weixin_33561350的博客 2970

c++2048小游戏编写

最近编写了一个小游戏,叫作2048,用到了面向对象的知识。

一个学生的博客 2371

FPGA实战:手把手教你配置4个Aurora 8B/10B IP核共享时钟(附完整工程文件)

本文详细介绍了在Xilinx FPGA上配置四个Aurora 8B/10B IP核并实现时钟共享的实战指南。从工程规划、IP核基础配置到共享逻辑的实现,再到多核时钟域与复位架构的设计,以及时序约束与调试技巧,提供了完整的解决方案和可复用的工程文件。特别强调了GT参考时钟的共享和复位信号的处理,帮助工程师高效解决多通道高速串行通信的设计挑战。

weixin_30879169的博客 411

yield函数c语言,yield的用法

我来解释一下这个程序:首先大家要知道为什么这个函数可以用在for循环中。不用问,因为这个函数是可迭代的,也就是这个函数可以每次都返回一个值。但是我们在gen()函数里看不到__iter__()和next() 方法。其实它隐藏在yield里。高级语言就是这样,隐藏了好多东西。这个和c语言就不同了。C语言可以看到每个细节。在这里程序执行到yield 1的时候就停止了,下面的程序不再执行,然后返回一个值...

weixin_29661407的博客 1845

华为昇腾Atlas 200I DK A2实战:从开箱到运行首个AI应用

本文详细介绍了华为昇腾Atlas 200I DK A2开发板从开箱到运行首个AI应用的全过程。包括硬件准备、系统烧录、开发板连接方案、AI应用运行及性能优化技巧,帮助开发者快速上手部署AI项目,提升开发效率。

weixin_27038245的博客 590

yield函数c语言,关于C#:yield语句实现

我想以一种易于理解的形式了解有关yield声明的所有信息。我已经阅读过yield语句及其在实现迭代器模式时的易用性。然而,大部分是非常干燥的。我想了解一下微软是如何处理收益率的。另外,你什么时候使用屈服点?你不能同时得到"一切"和"容易理解",对不起!仅供参考,我将于7月2日从语言设计和实现的角度发表一系列关于这个特性的博客文章。以下是从陈瑞蒙的博客开始:C语言中迭代器的实现及其后果(第1部分)C...

weixin_39587164的博客 486

【tio-websocket】15、学习tio的第1步—tio-study

tio-study 是用于学习 t-io 的示范工程,tio-study 是入门 t-io 最好的方式!tio-study 工程演示的是一个典型的 TCP 长连接应用工程,分为 server(服务端) 和 client(客户端) 工程,server 和 client 共用 common(公共模块) 工程

JACKAL 1万+

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(一)

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(一)

宁波阿成的博客 659

yield关键字如何暂停函数的执行

关键字用于在Python的生成器函数中暂停函数的执行。当生成器函数被调用时,它返回一个生成器对象,而不是立即执行函数体。()**方法被调用时,函数会从上次暂停的地方继续执行,直到遇到下一个yield关键字。

重剑无锋博客 557

第3.1.3章 机器人第三方库实战总结:ROS 2 入门实战及和ROS1的对比,打通机器人开发的任督二脉

本文针对机器人SLAM开发中第三方库的学习痛点,重点介绍ROS 2在SLAM中的应用。文章首先对比ROS 1与ROS 2的核心差异,梳理ROS 2知识图谱,包括节点、话题、服务等核心概念。通过实战项目演示如何构建激光SLAM节点,结合代码详解运行流程。最后给出学习建议,强调动手实践的重要性,帮助开发者快速掌握ROS 2在SLAM开发中的关键应用。

行知SLAM 179

Python中yield的用法详解

yield关键字是Python中创建生成器的强大工具,它允许函数在保持状态的同时,一次返回一个值。这不仅使得代码更加简洁,而且提高了内存效率,特别是在处理大型数据集或需要懒加载的场景中。通过本文的介绍和示例,你应该对yield的用法有了更深入的理解。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章彻底理解Python中的yieldpython中yield的用法详解——最简单,最清晰的解释_yield python-优快云博客。

ning的博客 2107

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

python yield用法_Python yield的用法

yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子:def addlist(alist):for i in alist:yield i + 1取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项:alist = [1, 2, 3, 4]for x in addl...

weixin_39775029的博客 164

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python yield from_python yield和yield from用法总结

python yield和yield from用法总结yield 作用:注: generator的next()方法在python 2中为next(),但在python 3中为 __next__() 【next的前后各是两个下划线】把一个函数变成一个generator,带有yield的函数不再是一个普通函数。即:一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成...

weixin_39779032的博客 143

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python yield 用法详解

文章目录1. 背景2. 如何生成斐波那契數列清单 1. 简单输出斐波那契數列前 N 个数清单 2. 输出斐波那契數列前 N 个数第二版清单 3. 通过 iterable 对象来迭代清单 4. 第三个版本清单 5. 使用 yield 的第四版清单 7. 使用 isgeneratorfunction 判断清单 8. 类的定义和类的实例清单 9. 另一个 yield 的例子3. next停止的位置 1. 背景 您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓

爱死亡机器人 1449

Python中的yield的用法

转载一篇自己认为讲得很好的博客 python中yield的用法详解——最简单,最清晰的解释

qq_43566675的博客 257

「详解」Python中yield的用法

文章摘要: yield关键字用于创建生成器函数,这种函数不会一次性执行完毕,而是可以暂停和恢复执行。生成器通过yield返回一个值并暂停,下次调用时从上一次暂停处继续执行。与普通函数不同,生成器保存了函数状态,实现了惰性计算。yield from语法可以简化生成器嵌套。生成器典型应用包括:处理大文件流(逐行读取避免内存不足)、生成无限序列、构建数据处理管道等。生成器还支持双向通信,通过.send()方法可以传递值给生成器。

绿色羽毛 1882

python中yield用法

可参考:python中yield的用法详解——最简单,最清晰的解释

qq_38261075的博客 116

python中的yield用法详解

首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器),好了,如果你对这些不明白的话,那先把yield看做return,然后直接看下面...

shy-2的博客 255

python 关键字 yield 用法

python 关键字 yield 用法yield 的基本用法 yield 词典里有两个解释:产出和让步 1.produce or provide (a natural, agricultural, or industrial product). “the land yields grapes and tobacco” 2.give way to arguments, demands, or pre...

u010713350的博客 574

python from函数用法_python yield和yield from用法总结详解

python yield和yield from用法总结yield 作用:注: generator的next()方法在python 2中为next(),但在python 3中为 __next__() 【next的前后各是两个下划线】把一个函数变成一个generator,带有yield的函数不再是一个普通函数。即:一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 g...

weixin_40001519的博客 421

python yield原理_Python yield 用法

yield 简单说来就是一个生成器,生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。生成器 是 一个函数函数的所有参数都会保留第二次调用 此函数 时使用的参数是前一次保留下的.生成器还“记住”了它在流控制构造生成器不仅“记住”了它数据状态。 生成器还“记住”了它在流控制构造(在命令式编程中,这种...

weixin_39946964的博客 192

python中yield的用法

yield是用于生成器(generator)的一种关键字。与return类似,它可以从函数返回值,但不同的是,yield返回的值可以在下次函数调用时继续执行,而不是退出函数。因此,yield的主要目的是使一个函数变成一个生成器,可以逐步迭代处理大数据或流数据,而不用一次性地占用大量内存。

weixin_46545179的博客 844
上一篇: linux eclipse出错-failed to load the jni shared
下一篇: eclipse django === Pydev unresolved import errors
wavee
博客等级 码龄22年 0粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值