一、什么是生成器?
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
二、创建生成器的方式
2.1、将列表生成式中的[]换成(),就可以创建一个生成器
g = (i for i in range(5))
上图中的g就是一个生成器对象,我们可以使用next(g)函数来获取generator的下一个返回值
当计算出最后一个元素,没有更多元素时会抛出StopIteration异常,一般情况下我们使用for循环去遍历生成器对象中的值,并且不会报错。
2.2、使用函数创建生成器(yield关键字)
当在一个函数中声明了yield关键字,说明这是一个生成器,而不是一个普通函数
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
注意:其中 a,b = b,a + b 等价于 t = (b,a+b) a= t[0] b = t[1]
三、注意事项
注意:使用生成器,只能遍历一次
知乎上的一个关于python生成器的帖子:https://www.zhihu.com/question/24807364