python-如何以Python方式从列表中产生所有值?

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

这就是我的意思。 多亏了一些非延迟计算,我才计算出了列表2989579180238238701568,但是我在整个项目中的代码使用了延迟计算,因此我想从函数中产生值,而不是返回整个列表。

我目前将其编写如下:

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

但这对我来说并不好用。

bodacydo asked 2020-07-30T17:35:23Z
4个解决方案
55 votes

由于这个问题没有具体说明; 我将提供适用于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())
SingleNegationElimination answered 2020-07-30T17:37:34Z
28 votes

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

return iter(List)

但是如果您已经有了列表,则可以返回该列表,这样会更有效。

Anurag Uniyal answered 2020-07-30T17:37:00Z
2 votes

您可以说出一台发电机

(x for x in List)
Johannes Charra answered 2020-07-30T17:37:54Z
-1 votes

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

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

In [2]: (x for x in my_list)
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230>
Anurag Misra answered 2020-07-30T17:38:14Z
translate from https://stackoverflow.com:/questions/2498388/how-to-pythonically-yield-all-values-from-a-list