基于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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
window下eclipse安装python插件教程
Apr 24 Python
python生成式的send()方法(详解)
May 08 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
python交互模式基础知识点学习
Jun 18 Python
python爬虫请求头设置代码
Jul 28 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 Python
python实现简单的学生管理系统
Feb 22 Python
python中requests库+xpath+lxml简单使用
Apr 29 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
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
js获取Get值的方法
2016/09/29 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Mac安装python3的方法步骤
2019/08/09 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
python opencv进行图像拼接
2020/03/27 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
函授本科毕业自我鉴定
2013/10/09 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
放飞理想演讲稿
2014/09/09 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
Linux中各个目录的作用与内容
2022/06/28 Servers