基于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实现排序算法
Feb 14 Python
跟老齐学Python之重回函数
Oct 10 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 Python
python生成式的send()方法(详解)
May 08 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
python如何查看微信消息撤回
Nov 27 Python
Python 学习教程之networkx
Apr 15 Python
Django models.py应用实现过程详解
Jul 29 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
Python实现画图软件功能方法详解
Jul 28 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
PHP队列用法实例
2014/11/05 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
浅谈js中的this问题
2017/08/31 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
python实现合并两个排序的链表
2019/03/03 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
满月酒答谢词
2014/01/14 职场文书
给校长的建议书600字
2014/05/15 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL