python-生成器即send()用法
参考链接:
http://www.mamicode.com/info-detail-2399245.html
作者首先介绍了生成器的作用:是为了让程序员可以更简单的编写用来产生值的序列的代码,然后又介绍了一些其他知识。
然后介绍了send是PEP 342加入的新特性
通过 send 方法来将一个值”发送“给生成器。 other = yield foo 这样的语句的意思是,"返回 foo 的值,这个值返回给调用者的同时,将 other 的值也设置为那个 send 发送的值"
重点:看这句 xx = yield yy
摘要: send() 的作用是使xx赋值为发送的值(send的参数),然后让生成器执行到下个 yield .. 即先用 send(none) 启动,然后每次赋值,赋值后就相当于调用了 next()
使用 send(params) 需要区分情况。
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK' def produce(c):
c.send(None)#先用空值启动生成器
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)#启动后在传入真实的值
print('[PRODUCER] Consumer return: %s' % r)
c.close() c = consumer()
produce(c)
#解释
'''注意到consumer函数是一个generator,把一个consumer传入produce后:
首先调用
c.send(None)启动生成器;然后,一旦生产了东西,通过
c.send(n)切换到consumer执行;consumer通过yield拿到消息(n接受赋值),处理,又通过yield把结果传回(返回r);produce拿到consumer处理的结果,继续生产下一条消息;produce决定不生产了,通过c.close()关闭consumer,整个过程结束。'''
注意:如果生成器未启动,则必须在使用send()前必须要启动生成器,而启动的方法可以是 generator.next() 或是 generator.send(None) 执行到第一个yield处。之后就可以使用 send(params) 不断传入值了。如果是已启动,则 send(params) 的作用就是对xx赋值为发送的值(send的参数),然后让生成器执行到下个yield..
为什么需要 send(None) ,也很好理解,因为 生成器还没有走到第一个 yield 语句,如果我们发生一个真实的值,这时是没有人去“接收”它的。一旦生成器启动了,就对象接受(即=号左边的左值xx接受了),之后就可以使用 send(params) 不断传入值了
每次的 send() 都会运行到 yield 语句,但赋值不会执行,只会有返回值,相当于return后就退出函数了,所以在返回值之后的赋值就不会执行了。(不理解)
在我看来send()的作用是在next()的基础上,多了个给xx赋值的功能。 consumer 通过 yield 拿到消息(n接受赋值),处理,又通过 yield 把结果传回(返回r);然后执行到下一个 yield 处===>可以看出当send方法的参数为None时,它与next方法完全等价
python-生成器即send()用法的更多相关文章
- python 生成器 的send
>>> def f(): c=yield 5 print c d=yield c+5 print d >>> b=f() >>> b.send(N ...
- python生成器yield和send
创建生成器 #第一种创建生成器的方法 #使用()创建生成器,如果使用[]则创建列表 a = (x**2 for x in range(1, 5)) #可以通过next一直产生新的数据,直到最后一个报异 ...
- 【python之路29】python生成器generator与迭代器
一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...
- Python生成器与yield
列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...
- [转]使用python来操作redis用法详解
转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...
- python 生成器 迭代器
阅读目录 一 递归和迭代 二 什么是迭代器协议 三 python中强大的for循环机制 四 为何要有for循环 五 生成器初探 六 生成器函数 七 生成器表达式和列表解析 八 生成器总结 一 递归和迭 ...
- Python生成器-博文读后感
Windows 10家庭中文版,Python 3.6.4, 上午看过了一篇讲Python生成器的博文: 提高你的Python: 解释‘yield’和‘Generators(生成器)’(英文原文) 这篇 ...
- python生成器 协程
生成器 参考文章: 协程 gevent 生成器进阶 看个例子: def gg(): n='' i=0 while True: n=yield i #通过send传入到n if not n: pa ...
- Python 生成器和协程
Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...
- 小学生都能学会的python(生成器)
小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...
随机推荐
- CentOS_mysql8.0_错误
#参考资料 CSND:https://blog.csdn.net/y_server/article/details/78781177 博客园:http://www.cnblogs.com/testwa ...
- Scrapy中scrapy.Request和response.follow的区别
在写scrapy的spider类的parse方法的时候,有些链接需要提取出来继续爬取,这里scrapy提供了一些方法可以方便的实现这个功能,总结如下: 假设我们的目标a标签是target_a 方法1: ...
- python的一些配置
昨天西邮的学友让我看一段python svm的输入文件格式,但是我打开很久不用的pycharm后发觉python包早已过时.于是搜了一下教程,看来python也得同时补习了 另外,机器学习还需要装很多 ...
- Reactive programming-文章解析
数据源(信息源):静态的数组.动态的流: In computing, reactive programming is a declarative programming paradigm concer ...
- pyftpdlib 搭建ftp环境
环境搭建: pythonwindows/linuxpip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/)一 ...
- 【jQuery01】添加添加div
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Swagger 生成 PHP API 接口文档
Swagger 生成 PHP API 接口文档 Lumen微服务生成Swagger文档 1.概况 有同学反馈写几十个接口文档需要两天的工作量, 随着多部门之间的协作越来越频繁, 维护成本越来越高, 文 ...
- Docker安装MySQL忽略大小写问题的问题
原文:Docker安装MySQL忽略大小写问题的问题 连接MySQL: 查看当前mysql的大小写敏感配置show global variables like '%lower_case%';+---- ...
- 洛谷 P3146 [USACO16OPEN]248
P3146 [USACO16OPEN]248 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...
- Android数据分批载入-滑动究竟部自己主动载入列表
Android数据分批载入-滑动究竟部自己主动载入列表 2014年5月9日 摘自:<Android高级开发实战-ui.ndk与安全> 本博文介绍怎样进行数据分批载入,在应用开发其中会常常使 ...