任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

在异步IO的使用时,generator是最基本的一个实现方法。python生成器有两个主要方法,一个是send一个是next。今天我们来看看两者的用法和联系。在每段代码中,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数后面再次调用next,依次类推。

这里我们用经典的生产者-消费者模型举个例子(摘自廖雪峰的博客)

1 def consumer():
2     r = 0
3     for i in xrange(3):
4         yield r
5         r = '200 OK'+ str(i)
6
7 c = consumer()
8 n1 = c.next()
9 n2 = c.next()
10 n3 = c.next()

实际上next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。

第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有Python yield语句来接收这个值。

下面说明下send执行的顺序。先记住,n1 = yield r这句话是从右往左执行的。当第一次send(None)(对应11行)时,启动生成器,从生成器函数的第一行代码开始执行,直到第一次执行完yield(对应第4行)后,跳出生成器函数。这个过程中,n1一直没有定义。

运行到send(1)时,进入生成器函数,此时,将yield r看做一个整体,赋值给它并且传回。此时即相当于把1赋值给n1,但是并不执行yield部分。下面继续从yield的下一语句继续执行,然后重新运行到yield语句,执行后,跳出生成器函数。即send和next相比,只是开始多了一次赋值的动作,其他运行流程是相同的。

1 def consumer():
2     r = 'here'
3     while True:
4         n1 = yield r   #这里的等式右边相当于一个整体,接受回传值
5         if not n1:
6             return
7         print('[CONSUMER] Consuming %s...' % n1)
8         r = '%d00 OK' % n1
9
10 def produce(c):
11     aa = c.send(None)
12     n = 0
13     while n < 5:
14         n = n + 1
15         print('[PRODUCER] Producing %s...' % n)
16         r1 = c.send(n)
17         print('[PRODUCER] Consumer return: %s' % r1)
18     c.close()
19
20 c = consumer()
21 produce(c)

运行结果:

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 100 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 300 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 400 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 500 OK

Python生成器中的send()与next()方法解析相关推荐

  1. python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程

    在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...

  2. python 可以根据元素值删除的是_python中删除某个元素的方法解析

    这篇文章主要介绍了python中删除某个元素的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python中关于删除list中的某个元素,一 ...

  3. python基础教程:修改Python列表中元素的几种方法

    一.在for循环中直接更改列表中元素的值不会起作用: 如: l = list(range(10)[::2]) print (l) for n in l: n = 0 print (l) 运行结果: [ ...

  4. python threading中的join和setDaemon方法

    python 多线程的threading中的join和setDaemon方法 join():通俗的将就是阻止子线程随着主线程的结束而结束 setDaemon():设置子线程是否随着主线程的结束而结束, ...

  5. python isalpha_Python中处理字符串之isalpha()方法的使用

    Python中处理字符串之isalpha()方法的使用 更新时间:2015年05月18日 12:01:20 投稿:goldensun 这篇文章主要介绍了Python中处理字符串之isalpha()方法 ...

  6. python生成器与迭代器(配套相关案列解析用法)

    一.python生成器简介 在 Python 中,使用了 yield 的函数被称为生成器(generator).跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就 ...

  7. python 执行shell命令行效率提升_在python脚本中执行shell命令的方法

    使用Python处理一个shell命令或一个执行一个shell脚本,一般情况下,有以下三种方法,以下我们来看: 第一种方法是使用os.system的方法 os.system(" cmd&qu ...

  8. Python列表中字符串转数字的方法

    比如我们有个列表: number = ['1', '2', '3', '4']; 如果我们需要将列表里的元素转换为数字呢?最常用的大家可能会想到使用列表推导式: ''' 学习中遇到问题没人解答?小编创 ...

  9. python2编码unicode,在不终止Unicode的情况下,在Python 2中编码转义字符的正确方法是什么?...

    I think I'm going crazy with Python's unicode strings. I'm trying to encode escape characters in a U ...

  10. Python 类中的get和set方法

    定义了一个Person类 具有name和age两个属性 在定义get方法前加@property装饰器,使用时候直接 变量 = 类名.属性名  不要加()!!!! 在定义set方法前加@属性名.sett ...

最新文章

  1. 树形结构在关系数据库中的设计
  2. 使用restTemplate报400或者415错误
  3. 1516. 棋盘上的车[组合数学][状态压缩]
  4. Thinkphp中import的几个用法详细介绍
  5. 无法将项目和文件的编码格式从UTF-8转为GBK
  6. hdu2648 Shopping-map容器
  7. 45 SD配置-销售凭证设置-分配订单类型/状态参数文件
  8. linux git 搭建 debian,基于Debian Linux搭建Git服务器
  9. 根据文件名 kill 进程
  10. Go---第六章:方法(小知识点笔记)
  11. 分享一个超棒的免费jQuery幻灯插件:Nivo Slider
  12. javaWeb项目之新闻管理系统详细开发过程
  13. macOS 10.14安装win10教程 bootcamp篇
  14. 汤唯:在街头卖艺的那些日子
  15. 双机互联(交叉线方法)
  16. 亚控科技笔试面试记录
  17. 论文引用 - 1. JavaScript论文应用
  18. JS点击复制按钮复制相关内容
  19. vue:项目页面在苹果手机浏览器上上下滑动出现卡顿现象
  20. 网站实现新浪微博登录

热门文章

  1. Docker 踩坑之一:Error response from daemon: write *** : no space left on device
  2. 倾斜摄影 实景三维建模软件photoscan教程
  3. C++ Maps 映射
  4. html dom之iframe对象
  5. 自定义Android TabHost的背景及文字
  6. php array_diff 用法
  7. Linux和Win文件互传及vim的使用
  8. 解决 jsp:include 引用文件时出现乱码的问题
  9. Thread was being aborted.(调试或执行较长时间的程序时发生的错误)
  10. ACL'22 | 一文解读复旦黄萱菁、邱锡鹏等老师NLP实验室的12篇长文