2022年啦,新年一次发文,祝大家在新的一年里,健康快乐,立下Flag都能实现,今天主要分享yield生成器。
相信大家在学习python的时候,肯定会看到yield这个关键词,如果暂时不了解的话,我们可以将它理解为return。但是它和return有点不一样,return返回后,程序终止,但是yield返回的是一个生成器,同时会记住当前程序的执行位置。下面是一个示例代码
gen方法是一个生成器
#!/usr/bin/python
# -*- coding: utf-8 -*-
def gen():
while True:
print('starting......')
res = yield 5
print(f'res{res}')
print('end......')
func = gen()
print(func) # <generator object gen at 0x7fb670237eb0>
print(type(func)) # <class 'generator'>
我们看到方法gen返回的是一个generator,是一个生成器,但是怎么获取里面的值呢?通过生成器的next
#!/usr/bin/python
# -*- coding: utf-8 -*-
def gen():
while True:
print('starting......')
res = yield 5
print(f'res:{res}')
print('end......')
func = gen()
print(func) # <generator object gen at 0x7fb670237eb0>
print(type(func)) # <class 'generator'>
print(next(func))
# 第一个next输出
# starting......
# 5
print(next(func))
# 第二个next输出
# res:None
# end......
# starting......
# 5
我们可以看到打印输出,第二个输出是接着第一个next输出的,yield返回的值并不会直接赋值给res,yield返回的值是返回给生成器func,同时同时通过next获取。我们可以通过打断点的方式,可以看到这个程序的执行顺序:
res的值一直是None,但是有没有办法更改呢,是可以的,生成器提供了一个send方法,以下代码可以通过send方法改变res,再遇到第三个next,打印了res的值是5
#!/usr/bin/python
# -*- coding: utf-8 -*-
def gen():
while True:
print('starting......')
res = yield 5
print(f'res:{res}')
print('end......')
func = gen()
print(func) # <generator object gen at 0x7fb670237eb0>
print(type(func)) # <class 'generator'>
print(next(func))
print(next(func))
func.send(5)
print(next(func))
#######
starting......
5
res:None
end......
starting......
5
res:5
end......
starting......
res:None
end......
starting......
5
#####
今天关于yield就差不多结束,但是为什么要使用yield呢?一般用得比较多的是列表创建、协程等,我们去一个例子,比如我们创建一个很大的list,可能通过以下代码进行创建,但是会耗费很大的内存
def create_list():
result = list()
for i in range(10000):
result.append(i)
return result
for i in create_list():
print(i)
我们可以通过yield实现,如下:
def create_list_gen():
for i in range(10000):
yield i
for i in create_list_gen():
print(i)
只有迭代的时候才会使用内存,减少内存。
更多的使用,以后我们遇到,今天就分享到这里啦!
本文分享自 暴走的软件测试Tester 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!