生成器与列表附加在Python

时间:2017-11-14 11:18:26

标签: python

对于简单列表创建,建议使用列表推导。但是,当涉及到更复杂的场景时,跨越多行创建列表是更明智的。

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?

1 个答案:

答案 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 ]