python生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

创建一个生成器

l = [ i*2 for i in range(10)]
print(l) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 列表生成式
G = (i*2 for i in range(10))
print(G) #生成器

创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

循环generator

可以用for对generator遍历。

for j in G:
    print(j)

0
2
4
6
8
10
12
14
16
18

对于列表,我们可以在长度内任意取值,而生成器只有在循环到这一次了才有值。

l = [ i*2 for i in range(10)]
G = (i*2 for i in range(10))
print(l[4]) #8
print(G[4]) #TypeError: 'generator' object is not subscriptable

generator中有一个next()方法可以直接使用。第一次使用返回第一个值,第二次使用返回第二个值,以此类推。这个是获取下一个值,generator中没有获取上一个值的方法。

G = (i*2 for i in range(10))
print(G.__next__()) #0
print(G.__next__()) #2
print(next(G)) #4
print(next(G)) #6

参考文档: 生成器---廖老师博客