浅谈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 相关文章推荐
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
Jun 11 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
python 对字典按照value进行排序的方法
May 09 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
Jun 05 Python
python中pathlib模块的基本用法与总结
Aug 17 Python
简述python Scrapy框架
Aug 17 Python
python的链表基础知识点
Sep 13 Python
python -v 报错问题的解决方法
Sep 15 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
php入门小知识
2008/03/24 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
使用php shell命令合并图片的代码
2011/06/23 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
jquery选择器使用详解
2014/04/08 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
为什么JavaScript没有块级作用域
2016/05/22 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
pandas分组聚合详解
2020/04/10 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
Java文件和目录(IO)操作
2014/08/26 面试题
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
物流管理专业自荐信
2014/06/23 职场文书
2015年见习期工作总结
2014/12/12 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python