Python中生成器from list的多种用法

Python中生成器from list的多种用法,python,list,generator,Python,List,Generator,基本上,我处于以下情况-我生成一个列表,例如 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    # 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    #

问题在哪里?我怎样才能多次迭代呢?

您的生成器第一次就用完了。您应该在每次更新发电机时重新创建发电机:

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

您还可以创建一个快捷功能来帮助您,甚至可以创建一个:

然后:

 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
...

应该注意的是,
xrange
是python 2中
range
的生成器版本,而python 3+中的
range
是生成器,没有
xrange
@mylesgallager yes I更新。我猜我们只是在讨论Python2。我喜欢生成器函数。或者,对于这样一个简单的生成器,可以接受lambda,例如
gen=lambda:(2*x表示x范围内的x(10))
。当然,这两个函数中的任何一个都可以被赋予乘数和长度参数,使它们更加通用。没错,但事实并非如此。
 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
...