我是靠谱客的博主 狂野盼望,这篇文章主要介绍生成器(generator)生成器:,现在分享给大家,希望可以做个参考。

生成器:

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。

什么是生成器?

一边循环一边计算的机制就是生成器

生成起的本质就是迭代器

生成器包括两种:生成器函数和生成器表达式

生成器函数:

一个包含yield关键字的函数就是生成器函数。yield不能和return共用,并且yield只能用在函数内
yield和return相同的是可以返回值,不同的是yield不会结束函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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不能接受外部来的值

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
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
生成器表达式:

将列表推导式的 [] 改成 () 即可

复制代码
1
2
3
4
5
6
7
8
9
10
11
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)生成器内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部