基于Python中的yield表达式介绍


Posted in Python onNovember 19, 2019

python生成器

python中生成器是迭代器的一种,使用yield返回函数值。每次调用yield会暂停,而可以使用next()函数和send()函数可以恢复生成器。

这里可以参考Python函数式编程指南:对生成器全面讲解

注意到yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法。

这个知识点在协程中需要使用。协程的概念指的是在一个线程内,一个程序中断去执行另一个程序,有点类似于CPU中断。这样减少了切换线程带来的负担,同时不需要多线程中的锁机制,因为不存在同时写的问题。

python使用生成器来实现协程,下面看一个python协程应用于生产者消费者问题的例子

def consumer():
 r = 'yield'
 while True:
  #当下边语句执行时,先执行yield r,然后consumer暂停,此时赋值运算还未进行
  #等到producer调用send()时,send()的参数作为yield r表达式的值赋给等号左边
  n = yield r #yield表达式可以接收send()发出的参数
  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) #调用consumer生成器
  print('[PRODUCER] Consumer return: %s' % r)
 c.close()

c = consumer()
produce(c)

注意到send需要先调用send(None),因为只有生成器是暂停状态才可以接收send的参数。

为了理解send()恢复生成器的过程,我们可以再看一个例子:

def gen():
 a = yield 1
 print('yield a % s' % a)
 b = yield 2
 print('yield b % s' % b)
 c = yield 3
 print('yield c % s' % c)


r = gen()
x = next(r)
print('next x %s' % x)
y = r.send(10)
print('next y %s' %y)
z = next(r)
print('next z %s' % z)

基于Python中的yield表达式介绍

可以看到实际上y=r.send(10) 的参数10是赋给了a。整个运行过程即执行x=next(r) 之后,gen()执行了yield 1 然后暂停,没有进行对a的赋值。但再调用y=r.send(10) 时赋值过程继续,并把10赋给了a.

以上这篇基于Python中的yield表达式介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用于返回绝对值的abs()方法
May 14 Python
Python处理XML格式数据的方法详解
Mar 21 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
Python OpenCV获取视频的方法
Feb 28 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
python实现输入数字的连续加减方法
Jun 22 Python
Django logging配置及使用详解
Jul 23 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Python 实现一个简单的web服务器
Jan 03 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 02 Python
Python 操作pdf pdfplumber读取PDF写入Exce
Aug 14 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 #Python
wxPython电子表格功能wx.grid实例教程
Nov 19 #Python
python 实现return返回多个值
Nov 19 #Python
wxPython实现带颜色的进度条
Nov 19 #Python
Python使用Pandas读写Excel实例解析
Nov 19 #Python
pycharm修改file type方式
Nov 19 #Python
wxPython实现列表增删改查功能
Nov 19 #Python
You might like
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
ie 调试javascript的工具
2009/04/29 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
js实现打字小游戏
2019/12/17 Javascript
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
Python 支持向量机分类器的实现
2020/01/15 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
python 如何调用远程接口
2020/09/11 Python
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
运动会领导邀请函
2014/02/05 职场文书
好听的队名和口号
2014/06/09 职场文书
企业战略合作意向书
2015/05/08 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL