基于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基于Socket实现的简单聊天程序示例
Aug 05 Python
深入理解Django的中间件middleware
Mar 14 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
django 模版关闭转义方式
May 14 Python
Python 防止死锁的方法
Jul 29 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
Python中with上下文管理协议的作用及用法
Mar 18 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关联数组的10个操作技巧
2013/01/21 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
js中生成map对象的方法
2014/01/09 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
python中time tzset()函数实例用法
2021/02/18 Python
商品陈列协议书
2014/09/29 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
英语辞职信怎么写
2015/02/28 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
初中政治教师教学反思
2016/02/23 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
QT与javascript交互数据的实现
2021/05/26 Javascript
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
方法汇总:Python 安装第三方库常用
2022/04/26 Python