如何从列表中以Python的形式产生所有值?

时间:2010-03-23 08:17:58

标签: python generator yield

假设我有一个列表,我希望不返回,但要从中产生值。最狡猾的方式是什么?

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

我目前写的如下:

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

但这对我来说并不像是pythonic。

4 个答案:

答案 0 :(得分:48)

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

的答案

如果您只需要返回该列表,请执行Anurag suggests,但如果由于某种原因,所讨论的函数确实需要是生成器,则可以委托给另一个生成器;假设您要为结果列表添加后缀,但仅在列表首次耗尽时才会出现。

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

    if something:
        yield this
        yield that
        yield something_else

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

可替换地;你可以在常规函数中包装生成器并返回chain ed结果:这也有在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())

答案 1 :(得分:29)

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

return iter(List)

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

答案 2 :(得分:2)

您可以通过说

来构建生成器
(x for x in List)

答案 3 :(得分:-1)

执行此任务的最佳Python方法是

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

In [2]: (x for x in my_list)
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230>