参考链接:

  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后:

  1. 首先调用c.send(None)启动生成器;

  2. 然后,一旦生产了东西,通过c.send(n)切换到consumer执行;

  3. consumer通过yield拿到消息(n接受赋值),处理,又通过yield把结果传回(返回r);

  4. produce拿到consumer处理的结果,继续生产下一条消息;

  5. 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()用法的更多相关文章

  1. python 生成器 的send

    >>> def f(): c=yield 5 print c d=yield c+5 print d >>> b=f() >>> b.send(N ...

  2. python生成器yield和send

    创建生成器 #第一种创建生成器的方法 #使用()创建生成器,如果使用[]则创建列表 a = (x**2 for x in range(1, 5)) #可以通过next一直产生新的数据,直到最后一个报异 ...

  3. 【python之路29】python生成器generator与迭代器

    一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...

  4. Python生成器与yield

    列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...

  5. [转]使用python来操作redis用法详解

    转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...

  6. python 生成器 迭代器

    阅读目录 一 递归和迭代 二 什么是迭代器协议 三 python中强大的for循环机制 四 为何要有for循环 五 生成器初探 六 生成器函数 七 生成器表达式和列表解析 八 生成器总结 一 递归和迭 ...

  7. Python生成器-博文读后感

    Windows 10家庭中文版,Python 3.6.4, 上午看过了一篇讲Python生成器的博文: 提高你的Python: 解释‘yield’和‘Generators(生成器)’(英文原文) 这篇 ...

  8. python生成器 协程

    生成器 参考文章:  协程   gevent 生成器进阶 看个例子: def gg(): n='' i=0 while True: n=yield i #通过send传入到n if not n: pa ...

  9. Python 生成器和协程

    Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...

  10. 小学生都能学会的python(生成器)

    小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...

随机推荐

  1. CentOS_mysql8.0_错误

    #参考资料 CSND:https://blog.csdn.net/y_server/article/details/78781177 博客园:http://www.cnblogs.com/testwa ...

  2. Scrapy中scrapy.Request和response.follow的区别

    在写scrapy的spider类的parse方法的时候,有些链接需要提取出来继续爬取,这里scrapy提供了一些方法可以方便的实现这个功能,总结如下: 假设我们的目标a标签是target_a 方法1: ...

  3. python的一些配置

    昨天西邮的学友让我看一段python svm的输入文件格式,但是我打开很久不用的pycharm后发觉python包早已过时.于是搜了一下教程,看来python也得同时补习了 另外,机器学习还需要装很多 ...

  4. Reactive programming-文章解析

    数据源(信息源):静态的数组.动态的流: In computing, reactive programming is a declarative programming paradigm concer ...

  5. pyftpdlib 搭建ftp环境

    环境搭建: pythonwindows/linuxpip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/)一 ...

  6. 【jQuery01】添加添加div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Swagger 生成 PHP API 接口文档

    Swagger 生成 PHP API 接口文档 Lumen微服务生成Swagger文档 1.概况 有同学反馈写几十个接口文档需要两天的工作量, 随着多部门之间的协作越来越频繁, 维护成本越来越高, 文 ...

  8. Docker安装MySQL忽略大小写问题的问题

    原文:Docker安装MySQL忽略大小写问题的问题 连接MySQL: 查看当前mysql的大小写敏感配置show global variables like '%lower_case%';+---- ...

  9. 洛谷 P3146 [USACO16OPEN]248

    P3146 [USACO16OPEN]248 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...

  10. Android数据分批载入-滑动究竟部自己主动载入列表

    Android数据分批载入-滑动究竟部自己主动载入列表 2014年5月9日 摘自:<Android高级开发实战-ui.ndk与安全> 本博文介绍怎样进行数据分批载入,在应用开发其中会常常使 ...