在Python中从列表中多次使用生成器

pet*_*bel 2 python list generator

基本上,我正处于以下情况 - 我生成一个列表,例如

l = [2*x for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

我稍后会多次迭代,例如

for i in l: print i    # 0,2,4,6,8,10,12,14,16,18
for i in l: print i    # 0,2,4,6,8,10,12,14,16,18
for i in l: print i    # 0,2,4,6,8,10,12,14,16,18
Run Code Online (Sandbox Code Playgroud)

问题是列表太大而无法放入内存,因此我使用它的生成器形式,即:

l = (2*x for x in range(10))
Run Code Online (Sandbox Code Playgroud)

但是,在此构造之后,只有第一次迭代才有效:

for i in l: print i    # 0,2,4,6,8,10,12,14,16,18
for i in l: print i    #
for i in l: print i    #
Run Code Online (Sandbox Code Playgroud)

问题出在哪儿?我怎么可以多次迭代它?

Jun*_*sor 6

您的发电机第一次耗尽.你应该重新每次您生成更新它:

l = (2*x for x in range(10))
for i in l: print i
l = (2*x for x in range(10))
for i in l: print i
Run Code Online (Sandbox Code Playgroud)

(注意:你应该xrange在python 2中使用,因为range在内存中创建一个列表)

您还可以创建快捷功能来帮助您甚至生成器功能:

def gen():
    for i in range(10):
        yield 2 * i
Run Code Online (Sandbox Code Playgroud)

然后:

 for i in gen(): print i
 for i in gen(): print i
Run Code Online (Sandbox Code Playgroud)