浅谈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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Django在win10下的安装并创建工程
Nov 20 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
在Python中实现函数重载的示例代码
Dec 12 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 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实现简单爬虫的方法
2015/07/29 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python牛刀小试密码爆破
2011/02/03 Python
Python生成pdf文件的方法
2014/08/04 Python
Python如何快速实现分布式任务
2017/07/06 Python
关于Django外键赋值问题详解
2017/08/13 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
解决pip install psycopg2出错问题
2020/07/09 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
办公室主任职责范本
2014/03/07 职场文书
学校学雷锋活动总结
2014/06/26 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
运动会广播稿200字
2015/08/19 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers