浅谈Python生成器generator之next和send的运行流程(详解)


Posted in Python onMay 08, 2017

对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。

然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,后面再次调用next,依次类推。

下面是一个列子:

def consumer():
   r = 'here'
   for i in xrange(3):
     yield r
     r = '200 OK'+ str(i)

 c = consumer()
 n1 = c.next()
 n2 = c.next()
 n3 = c.next()

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

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

下面来着重说明下send执行的顺序。当第一次send(None)(对应11行)时,启动生成器,从生成器函数的第一行代码开始执行,直到第一次执行完yield(对应第4行)后,跳出生成器函数。这个过程中,n1一直没有定义。

下面运行到send(1)时,进入生成器函数,注意这里与调用next的不同。这里是从第4行开始执行,把1赋值给n1,但是并不执行yield部分。下面继续从yield的下一语句继续执行,然后重新运行到yield语句,执行后,跳出生成器函数。

即send和next相比,只是开始多了一次赋值的动作,其他运行流程是相同的。

def consumer():
   r = 'here'
   while True:
     n1 = yield r
     if not n1:
       return
     print('[CONSUMER] Consuming %s...' % n1)
     r = '200 OK'+str(n1)

 def produce(c):
   aa = c.send(None)
   n = 0
   while n < 5:
     n = n + 1
     print('[PRODUCER] Producing %s...' % n)
     r1 = c.send(n)
     print('[PRODUCER] Consumer return: %s' % r1)
   c.close()

 c = consumer()
 produce(c)

 运行结果:

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK1
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK2
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK3
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK4
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK5

以上这篇浅谈Python生成器generator之next和send的运行流程(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
Python sys.argv用法实例
May 28 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python中循环引用(import)失败的解决方法
Apr 22 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
python实现随机漫步方法和原理
Jun 10 Python
python正则-re的用法详解
Jul 28 Python
python的pip有什么用
Jun 17 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
python生成式的send()方法(详解)
May 08 #Python
python实时分析日志的一个小脚本分享
May 07 #Python
python分割列表(list)的方法示例
May 07 #Python
Python 常用的安装Module方式汇总
May 06 #Python
python中OrderedDict的使用方法详解
May 05 #Python
Python编程生成随机用户名及密码的方法示例
May 05 #Python
Python实现统计文本文件字数的方法
May 05 #Python
You might like
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
php去除头尾空格的2种方法
2015/03/16 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
python多线程方式执行多个bat代码
2016/06/07 Python
python中requests小技巧
2017/05/10 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
python基础梳理(一)(推荐)
2019/04/06 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
使用python制作一个解压缩软件
2019/11/13 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
python软件都是免费的吗
2020/06/18 Python
降低python版本的操作方法
2020/09/11 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
电气技术员岗位职责
2013/11/19 职场文书
JS ES6异步解决方案
2021/04/29 Javascript