基于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 相关文章推荐
python3操作mysql数据库的方法
Jun 23 Python
python中import reload __import__的区别详解
Oct 16 Python
Python实现读取json文件到excel表
Nov 18 Python
200 行python 代码实现 2048 游戏
Jan 12 Python
Python3.6.0+opencv3.3.0人脸检测示例
May 25 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
Feb 13 Python
Python如何批量生成和调用变量
Nov 21 Python
python3爬虫中多线程的优势总结
Nov 24 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
PyTorch device与cuda.device用法
Apr 03 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中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
初识php MVC
2014/09/10 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
python实现计算倒数的方法
2015/07/11 Python
python实现内存监控系统
2021/03/07 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
浅谈django 重载str 方法
2020/05/19 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
上海奥佳笔试题面试题
2016/11/16 面试题
老教师工作总结的自我评价
2013/09/27 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
办理护照工作证明
2014/10/10 职场文书
军人离婚协议书样本
2014/10/21 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
工作经历证明范本
2015/06/15 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers