基于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文件和目录操作方法大全(含实例)
Mar 12 Python
Python正则表达式匹配HTML页面编码
Apr 08 Python
python正则表达式之作业计算器
Mar 18 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
python中的 zip函数详解及用法举例
Feb 16 Python
django和flask哪个值得研究学习
Jul 31 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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/09/10 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
django的autoreload机制实现
2020/06/03 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
html5 标签
2009/07/16 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
咖啡馆创业计划书
2014/01/26 职场文书
校园文化建设方案
2014/02/03 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
汇源肾宝广告词
2014/03/20 职场文书
村干部培训方案
2014/05/02 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
解决MySQL报“too many connections“错误
2022/04/19 MySQL
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers