代码之家  ›  专栏  ›  技术社区  ›  Uduse

Python中的生成器与列表附加

  •  6
  • Uduse  · 技术社区  · 7 年前

    对于简单的列表创建,建议使用列表理解。然而,当涉及到更复杂的场景时,跨多行创建列表更为可取。

    [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()]
    

    对我来说,使用这样的生成器来创建列表(嗯,生成列表)更自然,但我觉得这可能会增加不必要的复杂性。

    建议这样做吗?或者,哪条路更像蟒蛇?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Abhijith Asokan    7 年前

    生成器在运行中构建元素,一次一个。 对于以下语句:

    for e in my_generator():
        pass
    

    变量的值 e 在每次迭代期间生成 e 在上一次迭代中未存储。因此,它不存储列表的所有元素。所以它是内存高效的。

    但是,如果您计划在列表理解中使用generator,那么使用generator没有任何意义,因为所有元素都需要生成和存储。

    在这种情况下,您可以使用如下列表理解:

    result = [ convoluted(z) for x in complicated if y is complex for z in intricate_stuff ]