之前简单说过Python
中关于迭代器的概念,今天来简单说一下生成器。
所谓生成器,字面意思就是按照一定的算法生成一个序列。这么看来,迭代器和生成器的概念还有几分相似。其实,迭代器在某些场景下表现的像是生成器,但迭代器绝不是生成器,反倒是生成器实现了迭代器的协议。
生成器在Python
中常常通过yield
关键字来实现。如果一个方法使用了yield
关键字,那么它就是一个生成器函数。当调用生成器函数的时候,会返回一个迭代器,这个迭代器是以生成器对象的形式出现的。yield
返回的是生成器对象,当迭代访问的时候,代码才会执行,依次返回值,直到没有返回值为止。
生成器的使用场景是:
- 你不会两次使用所迭代的值
- 可以会有很多数据需要迭代访问,而生成器的惰性求值特性可以减小内存的压力
生成器迭代过一次之后就无法再供迭代使用了,而迭代器这可以反复迭代调用。两者对于内存和计算力的消耗差距明显(在数据量比较大的时候尤其明显)。
a = [x for x in range(7)] #一个迭代器
b = (x for x in range(7)) #一个生成器