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