基于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实现的防DDoS脚本
Feb 08 Python
Python计算程序运行时间的方法
Dec 13 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
巧用python和libnmapd,提取Nmap扫描结果
Aug 23 Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 Python
利用numpy和pandas处理csv文件中的时间方法
Apr 19 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
python使用装饰器作日志处理的方法
Jul 11 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
Python numpy线性代数用法实例解析
Nov 15 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 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扩展ZF――Validate扩展
2008/01/10 PHP
PHP 第二节 数据类型之转换
2012/04/28 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
js制作支付倒计时页面
2016/10/21 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
React中的render何时执行过程
2018/04/13 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
python多线程http下载实现示例
2013/12/30 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
使用matplotlib画散点图的方法
2018/05/25 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
django中使用POST方法获取POST数据
2019/08/20 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
小学生竞选班长演讲稿
2014/04/24 职场文书
自荐信模板大全
2015/03/27 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS