python3.6生成器yield用法实例分析
Python  /  管理员 发布于 7年前   228
本文实例讲述了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程序设计有所帮助。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号