我是靠谱客的博主 狂野盼望,最近开发中收集的这篇文章主要介绍生成器(generator)生成器:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

生成器:

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含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)生成器:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部