生成器

一、什么是生成器?

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

二、创建生成器的方式

2.1、将列表生成式中的[]换成(),就可以创建一个生成器

g = (i for i in range(5))
image.png

上图中的g就是一个生成器对象,我们可以使用next(g)函数来获取generator的下一个返回值

生成器_第1张图片
image.png

当计算出最后一个元素,没有更多元素时会抛出StopIteration异常,一般情况下我们使用for循环去遍历生成器对象中的值,并且不会报错。

生成器_第2张图片

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]

生成器_第3张图片
image.png

三、注意事项

注意:使用生成器,只能遍历一次

知乎上的一个关于python生成器的帖子:https://www.zhihu.com/question/24807364

你可能感兴趣的:(生成器)