Python 列表中生成器的多次使用
Multiple usage of generator from list in Python
基本上,我处于以下情况 - 我生成了一个列表,例如
l = [2*x for x in range(10)]
我稍后会多次迭代,例如
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
问题是列表太大,无法放入内存,因此我使用它的生成器形式,即:
l = (2*x for x in range(10))
然而,在这个构造之后只有第一次迭代有效:
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 #
问题出在哪里?我如何多次迭代它?
你的发电机第一次就耗尽了。您应该每次都重新创建生成器以更新它:
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
(注意:你应该在 python 2 中使用 xrange
因为 range
在内存中创建了一个列表)
您还可以创建一个快捷功能来帮助您甚至 generator function:
def gen():
for i in range(10):
yield 2 * i
然后:
for i in gen(): print i
for i in gen(): print i
你也可以直接迭代生成器:
for i in (2*x for x in range(10)): print i
for i in (2*x for x in range(10)): print i
...
基本上,我处于以下情况 - 我生成了一个列表,例如
l = [2*x for x in range(10)]
我稍后会多次迭代,例如
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
问题是列表太大,无法放入内存,因此我使用它的生成器形式,即:
l = (2*x for x in range(10))
然而,在这个构造之后只有第一次迭代有效:
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 #
问题出在哪里?我如何多次迭代它?
你的发电机第一次就耗尽了。您应该每次都重新创建生成器以更新它:
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
(注意:你应该在 python 2 中使用 xrange
因为 range
在内存中创建了一个列表)
您还可以创建一个快捷功能来帮助您甚至 generator function:
def gen():
for i in range(10):
yield 2 * i
然后:
for i in gen(): print i
for i in gen(): print i
你也可以直接迭代生成器:
for i in (2*x for x in range(10)): print i
for i in (2*x for x in range(10)): print i
...