基于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解释器相关安装方法
Oct 12 Python
python编写分类决策树的代码
Dec 21 Python
Python实现GUI学生信息管理系统
Apr 05 Python
python3实现磁盘空间监控
Jun 21 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
让你的Python代码实现类型提示功能
Nov 19 Python
python返回数组的索引实例
Nov 28 Python
TensorFlow 显存使用机制详解
Feb 03 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
Python切片列表字符串如何实现切换
Aug 06 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
JavaScript 学习技巧
2010/02/17 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
python中尾递归用法实例详解
2015/04/28 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
pandas 选择某几列的方法
2018/07/03 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
实例详解Python装饰器与闭包
2019/07/29 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
中式婚礼主持词
2014/03/13 职场文书
中秋晚会活动方案
2014/08/31 职场文书
委托书的写法
2014/09/16 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
家庭贫困证明
2015/06/16 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server