基于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数据类型详解(二)列表
May 08 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
Python元组拆包和具名元组解析实例详解
Mar 26 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
Python之list对应元素求和的方法
Jun 28 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
Python初学者常见错误详解
Jul 02 Python
Python中低维数组填充高维数组的实现
Dec 02 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
Python嵌入C/C++进行开发详解
Jun 09 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 Python
Python 如何实现访问者模式
Jul 28 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
农民C键的运用技巧
2020/03/04 星际争霸
PHP的几个常用数字判断函数代码
2012/04/24 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
试用php中oci8扩展
2015/06/18 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
jquery实现动态画圆
2014/12/04 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
python在不同层级目录import模块的方法
2016/01/31 Python
python Tkinter的图片刷新实例
2019/06/14 Python
python修改字典键(key)的方法
2019/08/05 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
业务经理岗位职责
2013/11/11 职场文书
财产公证书样本
2014/04/04 职场文书
初中英语课后反思
2014/04/25 职场文书
2015年教师新年寄语
2014/12/08 职场文书
六五普法学习心得体会
2016/01/21 职场文书
redis限流的实际应用
2021/04/24 Redis
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers