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黑魔法之参数传递
Feb 12 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
值得收藏的10道python 面试题
Apr 15 Python
python字符串Intern机制详解
Jul 01 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
python中的错误如何查看
Jul 08 Python
python实现最短路径的实例方法
Jul 19 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 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的一些小问题
2010/07/03 PHP
PHP中的Memcache详解
2014/04/05 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
python读写ini文件示例(python读写文件)
2014/03/25 Python
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
毕业生就业自荐书
2013/12/15 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
中学清明节活动总结
2014/07/04 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
高老头读书笔记
2015/06/30 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
Python WSGI 规范简介
2021/04/11 Python
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
SQL之各种join小结详细讲解
2021/08/04 MySQL