概述
生成器:
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。
什么是生成器?
一边循环一边计算的机制就是生成器
生成起的本质就是迭代器
生成器包括两种:生成器函数和生成器表达式
生成器函数:
一个包含yield关键字的函数就是生成器函数。yield不能和return共用,并且yield只能用在函数内
yield和return相同的是可以返回值,不同的是yield不会结束函数
def text():
for i in range(5):
yield i
t = text()
print(t)#<generator object text at 0x00000000039A0480>
#得到的是生成器对象,并没有执行生成器中的函数体
#这两种方法都可以获取值,不过每打印一次只会获得一个值,如果超出界限会报错
print(next(t))
#0
print(t.__next__())
#1
#使用for循环遍历,可以从前往后逐个生成
for i in t:
print(i)
0
1
2
3
4
send():send获取下一个值的效果和next()基本一致,只是在获取下一个值的时候给上一个yield的位置 传递一个数据
注意:
1.第一次使用生成器的时候需要使用next获取下一个值
2.最后一个yield不能接受外部来的值
def text():
print('a')
count = yield 1
print('---->',count)
print('b')
yield 2
t = text()
print(next(t))#打印a和1
g = t.send('123')#原本应该会打印b和2但send会把123传递给yield1,所以会打印出123和b
print(g)#打印2,相当于第三次next取值
#原本两次next取值就可以,但由于send会给上一个yield传递数据,就相当于需要获取两次yield1
生成器表达式:
将列表推导式的 [] 改成 () 即可
g = (i for i in range(5))
print(g)
#<generator object <genexpr> at 0x00000000038CBD68>
for i in g:
print(i)
0
1
2
3
4
最后
以上就是狂野盼望为你收集整理的生成器(generator)生成器:的全部内容,希望文章能够帮你解决生成器(generator)生成器:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复