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 28 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
python中的闭包函数
Feb 09 Python
浅析python的优势和不足之处
Nov 20 Python
python+mysql实现教务管理系统
Feb 20 Python
Django如何开发简单的查询接口详解
May 17 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
基于opencv实现简单画板功能
Aug 02 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
详解python网络进程
Jun 15 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中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
Array对象方法参考
2006/10/03 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
最短的IE判断代码
2011/03/13 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
汽车机修工岗位职责
2014/03/06 职场文书
出纳会计岗位职责
2014/03/12 职场文书
党员服务承诺书
2014/05/28 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
学生检讨书如何写
2014/10/30 职场文书
安全教育观后感
2015/06/17 职场文书
员工旷工检讨书
2015/08/15 职场文书