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 相关文章推荐
Django中login_required装饰器的深入介绍
Nov 24 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
Python多进程与服务器并发原理及用法实例分析
Aug 21 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
Django对models里的objects的使用详解
Aug 17 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 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简单封装了一些常用JS操作
2007/02/25 PHP
PHP 数组教程 定义数组
2009/10/23 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
用Python编写web API的教程
2015/04/30 Python
python获取地震信息 微信实时推送
2019/06/18 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
Python如何测试stdout输出
2020/08/10 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
蔻驰英国官网:COACH英国
2020/07/19 全球购物
请说出几个常用的异常类
2013/01/08 面试题
孝老爱亲模范事迹材料
2014/05/25 职场文书
体育专业求职信
2014/07/16 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
公民授权委托书
2014/10/15 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
队名及霸气口号大全
2015/12/25 职场文书
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL