56

假设我有一个我不想返回但从中产生值的列表。最pythonic的方法是什么?

这就是我的意思。多亏了一些非惰性计算,我已经计算了 list ['a', 'b', 'c', 'd'],但是我通过项目的代码使用了惰性计算,所以我想从我的函数中产生值而不是返回整个列表。

我目前写如下:

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

但这对我来说并不像pythonic。

4

4 回答 4

80

由于这个问题没有具体说明;我将提供适用于Python >= 3.3的答案

如果您只需要返回该列表,请按照Anurag 的建议进行操作,但如果出于某种原因,所讨论的函数确实需要成为生成器,您可以委托给另一个生成器;假设您想为结果列表添加后缀,但前提是列表首先用完。

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

    if something:
        yield this
        yield that
        yield something_else

但是,在 3.3 之前的 python 版本中,您不能使用这种语法;您必须使用问题中的代码,在正文中使用 for 循环和单个 yield 语句。

或者; 您可以将生成器包装在常规函数中并返回chained 结果:这也具有在 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())
于 2013-09-04T17:53:31.057 回答
38

用于iter创建列表迭代器,例如

return iter(List)

虽然如果你已经有一个列表,你可以直接返回它,这样会更有效率。

于 2010-03-23T08:24:34.920 回答
2

你可以通过说来构建一个生成器

(x for x in List)
于 2010-03-23T08:18:51.013 回答
0

完成此任务的最佳 Pythonically 方法是

In [1]: my_list = ['a', 'b', 'c', 'd']

In [2]: (x for x in my_list)
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230>
于 2017-08-18T11:47:38.933 回答