浅谈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备份Mysql脚本
Aug 11 Python
python爬取网站数据保存使用的方法
Nov 20 Python
Python中查看文件名和文件路径
Mar 31 Python
用tensorflow搭建CNN的方法
Mar 05 Python
python版本的仿windows计划任务工具
Apr 30 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
python绘制趋势图的示例
Sep 17 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
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
php中实现记住密码自动登录的代码
2011/03/02 PHP
php学习之流程控制实现代码
2011/06/09 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
javascript this用法小结
2008/12/19 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
python使用代理ip访问网站的实例
2018/05/07 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
详解python编译器和解释器的区别
2019/06/24 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
数据库连接池的工作原理
2012/09/26 面试题
毕业研究生的自我鉴定
2013/11/30 职场文书
抽奖活动主持词
2014/03/31 职场文书
工作岗位说明书模板
2014/05/09 职场文书
大学生应聘求职信
2014/05/26 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书