列表

详情


84. Python 生成器

回答思路

生成器是跟列表推导式对应的概念,举个简单的例子:

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&#95;print="" object="">  #在每次调用next()的时候执行,遇到yield语句返回,#再次执行时从上次返回的yield语句处继续执行。In [23]: next(gen_fun) Out[23]: 10  In [24]: next(gen_fun) Out[24]: 11  In [25]: </generator>

上一题