基于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 数据结构之队列的实现
Jan 22 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
Python中的单行、多行、中文注释方法
Jul 19 Python
pytorch permute维度转换方法
Dec 14 Python
Python给图像添加噪声具体操作
Mar 03 Python
python版DDOS攻击脚本
Jun 12 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
python中的反斜杠问题深入讲解
Aug 12 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 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
深入解析php模板技术原理【一】
2008/01/10 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
Python 模块EasyGui详细介绍
2017/02/19 Python
python常见排序算法基础教程
2017/04/13 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
详解python配置虚拟环境
2019/04/08 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
通息工程毕业生自荐信
2013/10/16 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
经济贸易系求职信
2014/08/04 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
信仰纪录片观后感
2015/06/08 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书