浅谈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实现的守护进程(Daemon)用法实例
Jun 02 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
python迭代dict的key和value的方法
Jul 06 Python
python多进程读图提取特征存npy
May 21 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
python写文件时覆盖原来的实例方法
Jul 22 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
详解Python描述符的工作原理
Jun 11 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
PHP的FTP学习(一)[转自奥索]
2006/10/09 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
PHP微信分享开发详解
2017/01/14 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
python中的__slots__使用示例
2015/02/26 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
python五子棋游戏的设计与实现
2019/06/18 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python telnet登陆功能实现代码
2020/04/16 Python
Python如何安装第三方模块
2020/05/28 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
几个人围成一圈的问题
2013/09/26 面试题
2014年新教师工作总结
2014/11/08 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android