浅谈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中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
python中字典dict常用操作方法实例总结
Apr 04 Python
Python简单网络编程示例【客户端与服务端】
May 26 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
python使用sqlite3时游标使用方法
Mar 13 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
Python中json.dumps()函数的使用解析
May 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
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
php遍历目录方法小结
2015/03/10 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
大学生年度自我鉴定
2013/10/31 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
古诗之感恩老师
2019/10/24 职场文书