假设我有一个我不想返回但从中产生值的列表。最pythonic的方法是什么?
这就是我的意思。多亏了一些非惰性计算,我已经计算了 list ['a', 'b', 'c', 'd']
,但是我通过项目的代码使用了惰性计算,所以我想从我的函数中产生值而不是返回整个列表。
我目前写如下:
my_list = ['a', 'b', 'c', 'd']
for item in my_list:
yield item
但这对我来说并不像pythonic。
由于这个问题没有具体说明;我将提供适用于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 语句。
或者; 您可以将生成器包装在常规函数中并返回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())
用于iter
创建列表迭代器,例如
return iter(List)
虽然如果你已经有一个列表,你可以直接返回它,这样会更有效率。
你可以通过说来构建一个生成器
(x for x in List)
完成此任务的最佳 Pythonically 方法是
In [1]: my_list = ['a', 'b', 'c', 'd']
In [2]: (x for x in my_list)
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230>