基于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输出一个杨辉三角的例子
Jun 13 Python
python字典键值对的添加和遍历方法
Sep 11 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 Python
python提取log文件内容并画出图表
Jul 08 Python
关于python字符串方法分类详解
Aug 20 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 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自动获取目录下的模板的代码
2010/08/08 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
Laravel5中contracts详解
2015/03/02 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
PHP 中常量的知识整理
2017/04/14 PHP
js 一个关于图片onload加载的事
2013/11/10 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
解决Python使用列表副本的问题
2019/12/19 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
Python flask框架端口失效解决方案
2020/06/04 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
材料加工硕士生求职信
2013/10/10 职场文书
会计出纳岗位职责
2013/12/25 职场文书
二手书店创业计划书
2014/01/16 职场文书
无犯罪记录证明
2014/09/19 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
Oracle使用别名的好处
2022/04/19 Oracle