回答思路
生成器是跟列表推导式对应的概念,举个简单的例子:
Python:
lst = [i for i in range(10)] #列表推导式gen = (i for i in range(10)) #生成器表达#注意,上面两行的区别只有[]和() #实际演示一下In [1]: gen = (i for i in range(10)) In [2]: gen Out[2]: <generator object=""><genexpr> at 0x7fb0c0f0e048> In [3]: lst = [i for i in range(10)] In [4]: lst Out[4]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] In [5]: next(gen) #访问生成器的每一个元素,使用next Out[5]: 0 In [6]: next(gen) Out[6]: 1 In [7]: next(gen) Out[7]: 2 In [8]: for x in gen: ...: print(x) ...: 3 4 5 6 7 8 9 </genexpr></generator>
列表推导与生成器表达式都可以用于初始化元组、数组或其他类型的序列。
但列表推导需要先建立一个完整的列表,存储所有的元素,然后再把这个列表传递到某个构造函数。
而生成器表达式会逐个产出元素(使用next()方法),用一个生成一个,而不是全部生成之后再返回,从而减少内存损耗。
关于生成器,还有另一个用法,即生成器函数,关键字是yield,简单来说可以把return 换成yield,就会从普通函数变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
Python:
In [20]: def gen_print(n): ...: yield n ...: n += 1 ...: ...: yield n ...: n += 1 ...: In [21]: gen_fun = gen_print(10) In [22]: gen_fun Out[22]: <generator at="" gen_print="" object=""> #在每次调用next()的时候执行,遇到yield语句返回,#再次执行时从上次返回的yield语句处继续执行。In [23]: next(gen_fun) Out[23]: 10 In [24]: next(gen_fun) Out[24]: 11 In [25]: </generator>