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

bod*_*ydo 44 python yield generator

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

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

我目前写的如下:

my_list = ['a', 'b', 'c', 'd']
for item in my_list:
    yield item
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*ion 56

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

如果你只需要返回那个列表,就像Anurag建议的那样,但如果由于某种原因,所讨论的函数确实需要是一个生成器,你可以委托给另一个生成器; 假设您要为结果列表添加后缀,但仅在列表首次耗尽时才使用.

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

    if something:
        yield this
        yield that
        yield something_else
Run Code Online (Sandbox Code Playgroud)

但是在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())
Run Code Online (Sandbox Code Playgroud)

  • `yield from list_`功能是一个很好的语法,是我来这里寻找的.惭愧我不能在2.7中使用它. (19认同)

Anu*_*yal 30

使用iter创建的列表迭代器如

return iter(List)
Run Code Online (Sandbox Code Playgroud)

虽然如果你已经有一个列表,你可以返回它,这将更有效.

  • @Anurag - 这似乎没有回答这个问题:如果我不想在那时返回,我想从列表中产生所有内容然后继续(可能产生更多东西)?这很常见(例如,当走一个递归结构时),就像bodacydo一样,我不认为"for x in list yield x"解决方案是Pythonic. (5认同)
  • 由于对`iter`的调用完全是多余的,因此这是过度的. (4认同)
  • `iter`是一种矫枉过正,但它不是完全多余的,它可以用来记住你在迭代列表时你在哪里,你可以传递它,列表你也必须通过一个索引 (2认同)