对于简单列表创建,建议使用列表推导。但是,当涉及到更复杂的场景时,跨越多行创建列表是更明智的。
e.g。一个简单的任务
[x for x in range(10)]
e.g。执行更复杂的任务
result = []
for x in complicated:
if y is complex:
for z in intricate_stuff:
result.append(convoluted(z))
(我可能仍会对上面的例子使用多行列表理解,但无论如何你都明白了。)
最近,我发现自己使用像:
这样的生成器实现列表创建def gen():
for x in complicated:
if y is complex:
for z in intricate_stuff:
yield convoluted(z)
result = [x for x in gen()]
使用像这样的生成器来创建列表(好吧,生成列表)对我来说更自然,但我觉得它可能会增加不必要的复杂性。
这是推荐的吗?或者,哪种方式更pythonic?
答案 0 :(得分:1)
Generators一次一个地构建元素。 因此对于以下陈述:
for e in my_generator():
pass
每次在迭代期间生成变量e
的值,不存储前一次迭代中e
的值。因此它不存储列表的整个元素。所以它具有内存效率。
但是如果你打算在列表理解中使用生成器,那么使用生成器是没有意义的,因为所有元素都需要生成和存储。
在这种情况下,您可以使用如下所示的列表理解:
result = [ convoluted(z) for x in complicated if y is complex for z in intricate_stuff ]