如何使用Python优雅地从列表中生成所有值?

68 投票
3 回答
69288 浏览
提问于 2025-04-15 20:44

假设我有一个列表,我不想一次性返回整个列表,而是想逐个提供里面的值。用Python最合适的方法是什么呢?

我想表达的是,假设我已经通过一些计算得到了这个列表 ['a', 'b', 'c', 'd'],但是在我的项目中,我的代码是采用懒惰计算的方式,所以我希望我的函数能够逐个提供值,而不是一次性返回整个列表。

我现在是这样写的:

my_list = ['a', 'b', 'c', 'd']
for item in my_list:
    yield item

但我觉得这样写不太符合Python的风格。

3 个回答

1

你可以通过下面的方式来创建一个生成器:

(x for x in List)
98

因为这个问题没有具体说明,所以我会给出一个适用于 Python 3.3 及以上版本 的答案。

如果你只需要返回一个列表,可以按照 Anurag 的建议 来做。但如果出于某种原因,这个函数确实需要是一个生成器,你可以把它委托给另一个生成器;假设你想在结果列表后面加上某些内容,但只有在列表用完之后才加。

def foo():
    list_ = ['a', 'b', 'c', 'd']
    yield from list_

    if something:
        yield this
        yield that
        yield something_else

不过在 Python 3.3 之前的版本中,你不能使用这种语法;你需要像问题中那样,使用一个 for 循环和一个单独的 yield 语句来实现。

另外,你也可以把生成器放在一个普通的函数里,然后返回 chain 的结果:这样做的好处是可以在 Python 2 和 3 中都能使用。

from itertools import chain

def foo():
    list_ = ['a', 'b', 'c', 'd']

    def _foo_suffix():
        if something:
            yield this
            yield that
            yield something_else

    return chain(list_, _foo_suffix())
40

使用 iter 可以创建一个列表的迭代器,比如这样:

return iter(List)

不过,如果你已经有一个列表了,其实可以直接返回这个列表,这样会更高效。

撰写回答