python3.6生成器yield用法实例分析
作者:thormas1996 发布时间:2022-11-22 00:07:05
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/thormas1996/article/details/80830266
猜你喜欢
- 这段时间服务器崩溃2次,一直没有找到原因,今天看到论坛发出的错误信息邮件,想起可能是mysql的默认连接数引起的问题,一查果然,老天,默认
- 复制代码 代码如下: public partial class CMS_DBDataContext { partial void OnCre
- 在前面的DRF系列教程中,我们以博客为例介绍了序列化器, 使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删
- 很多时候,希望能够在 HTML 中使用空格排版。但浏览器在解析 HTML 时,会把连续的空格解析成一个,所以我们会使用
- 最近有个功能需要java与python之间的数据交互,java需要把参数传给python,然后python计算的结果返回给java.于是就写
- 修改MySql Server安装目录下的 my.ini 文件,在mysqld节下加入下面一行set-variable=lower_case_
- 微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地,今天我们要将便是如何用Python来生成一个微信机器
- 前言2048游戏规则:简单的移动方向键让数字叠加,并且获得这些数字每次叠加后的得分,当出现2048这个数字时游戏胜利。同时每次移动方向键时,
- 做一个项目用到Ajax,开始觉得挺好,后来发现一个问题,例如删除一项,恢复之后就不能再接着删除,必须要等一段时间,后来知道是IE缓存的问题。
- 页面中header部分一般位于最上端(有时根据需要也会位于某一侧,不管它在页面中的位置如何,在XHTML代码中它总是优于其它元素先加载),内
- php获取域名的google收录示例function get_index($domain){ $url="http://www.g
- 在SQL查询中,关键词Like可提供模糊查询功能,它通常与通配符一起使用。1 Like条件适用数据库字段类型 &nbs
- 第一种:利用functools 工具处理import functoolsresult = (lambda k: functools.redu
- 两张表 组织架构表(Organise) 和 工资发放历史记录表 (WagePerMonthHis) 两张表通过 Organise.Item_
- 导言在前面我们学习了如何创建item级的DataList。和可编辑的GridView一样,每个DataList里的item都包含一个Edit
- memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放
- 加入CDC的这段日子里,工作中积累的小心得都密密麻麻的收在册子里。恰逢近期的校园招聘正如火如荼的展开着,借此机会,我把这一些不太成熟的小想法
- 前言python中进行面向对象编程,当在子类的实例中调用父类的属性时,由于子类的__init__方法重写了父类的__init__方法,如果在
- Web技术的发展速度太快了,如果你不与时俱进,就会被淘汰。因此,为了应对即将到来的HTML5,本文总结了22个HTML5的初级技巧,希望能对
- 本文实例讲述了python实现域名系统(DNS)正向查询的方法。分享给大家供大家参考,具体如下:域名系统(DNS)是一个分布式的数据库,主要