python3.6生成器yield用法实例分析


Posted in Python onAugust 23, 2019

本文实例讲述了python3.6生成器yield用法。分享给大家供大家参考,具体如下:

今天看源码的时候看到了一个比较有意思的函数:yield

功能与return类似,都是返回定义的函数的一个结果,不同的是return返回后这次调用函数就结束了,除了返回值,其余临时变量都会被清除。而yield会停止在当前步,并保留其余变量的值,等下次调用该函数时,从yield的下一步继续往下运行。

yield的好处是如果函数需要很大的内存,比方说需要计算并返回一个很大的数列,如果用return,我们只能用一个list来存储每一步再输出,而用yield的话,只需要一个变量的内存即可,每次输出当前步的值,下次调用函数接着从这一步继续。

文字不太好说明,看一个很容易理解的例子:(python3.6)

我们定义一个函数test(),看看return的效果

def test(n):
  for i in range(n):
    return i
    print('mark')

测试结果

for i in range(5):
  print(test(3))

输出

0
0
0
0
0

每次调用函数时碰到return就自动结束了,返回当前i值

再来看看yield的效果:

def test2(n):
  for i in range(n):
    yield i
    print('mark')

测试

for i in range(5):
  print(test2(3))

输出

<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>

只要函数中含有yield,python就会默认这个函数是一个生成器,这个测试相当于重复打开了三次生成器

生成器需要用next()调用

测试

t = test2(3)
for i in range(3):
  print('i=',i)
  print(next(t))

next(t) 等同于 t.__next__()

结果

i= 0
0
i= 1
mark
1
i= 2
mark
2

可以看到,第一次返回i=0之后,第二次再调用函数时,从yield i的下一步继续,即print('mark')

生成器还支持用send()将值传递进函数:

def test3():
  value = (yield 1)
  print(value)
  print('mark1')
  value = (yield value)
  print(value)
  print('mark2')

测试

t2 = test3()
print(t2.__next__())
print('-----------')
print(t2.send(2))
print('-----------')
print(t2.send(3))

输出

1
-----------
2
mark1
2
-----------
3
mark2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-102-56e62df29d71> in <module>()
      4 print(t2.send(2))
      5 print('-----------')
----> 6 print(t2.send(3))

StopIteration:

第一次next()返回1,并在当前停止,send(2)会将2传输给当前停止的那一步yield处,即相当于value = (yield 1)变为value = (2)

然后继续运行

print(value)
print('mark1')
value = (yield value)

碰到yield再次停止,返回此时的vlue值2,之后send(3)将3传输给当前停止那一步yield处,即第二个yield value处,继续运行

print(value)
print('mark2')

生成器运行结束后生成StopIteration

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
python树莓派红外反射传感器
Jan 21 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
python使用BeautifulSoup 解析HTML
Apr 24 Python
python基础 range的用法解析
Aug 23 #Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 #Python
Django接收自定义http header过程详解
Aug 23 #Python
Python 处理文件的几种方式
Aug 23 #Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 #Python
python @classmethod 的使用场合详解
Aug 23 #Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 #Python
You might like
十天学会php之第三天
2006/10/09 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php实现文件预览功能
2017/05/23 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
使用Tkinter制作信息提示框
2020/02/18 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
宾馆总经理岗位职责
2014/02/14 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
Hive常用日期格式转换语法
2022/06/25 数据库