Python小技巧5:需要动态生成列表的时候,考虑使用生成器替代

典型代码:

def mygen():
    i = 0
    while i < 100:
        yield i
        i += 1


if __name__ == '__main__':
    gen = mygen()
    for item in gen:
        print(item)

什么是生成器:

生成器是一个包含yield表达式的函数,只要一个函数中有了yield表达式,当调用这个函数的时候,函数体的代码压根就不会执行,它只是会返回一个生成器对象。如果访问一个生成器迭代器,每次访问到的值都是动态生成的(比如典型代码中的变量i),即是yield右边的值,并冻结当前状态,等待下一次访问。对于生成器对象可以将其理解为一种值的顺序生成规则的描述,生成器对象会一直维护自己的生成规则上下文,直到结束(当然,也可以不结束)。


应用场景:

如果需求是动态的生成一个列表,然后其它函数会一次性访问这个列表中的项,做相应的处理工作。


带来的好处:

1. 不必返回整个列表对象,只返回生成规则描述,如果元素数量较大,可以节省大量内存。生成器甚至可以生成一个无限序列,只要生成规则永不停止即可。

2. 逻辑清晰,一眼就能看到值是如何返回的。


注意的点:

生成器对象是有状态的,只能访问一次。这也很容易理解,因为生成器只是一个值的生成规则,加上其上下文,不像列表一样保存了所有的值。

也可以使用原生的迭代器协议访问生成器,但是需要手动处理迭代器结束时的StopIteration异常:

    gen = mygen()
    while True:
        try:
            data = next(gen)
            print(data)
        except StopIteration:
            print('Iteration done')
            break

你可能感兴趣的:(Python小技巧,Python)