如何使用Python优雅地从列表中生成所有值?
假设我有一个列表,我不想一次性返回整个列表,而是想逐个提供里面的值。用Python最合适的方法是什么呢?
我想表达的是,假设我已经通过一些计算得到了这个列表 ['a', 'b', 'c', 'd']
,但是在我的项目中,我的代码是采用懒惰计算的方式,所以我希望我的函数能够逐个提供值,而不是一次性返回整个列表。
我现在是这样写的:
my_list = ['a', 'b', 'c', 'd']
for item in my_list:
yield item
但我觉得这样写不太符合Python的风格。
3 个回答
1
你可以通过下面的方式来创建一个生成器:
(x for x in List)
98
因为这个问题没有具体说明,所以我会给出一个适用于 Python 3.3 及以上版本 的答案。
如果你只需要返回一个列表,可以按照 Anurag 的建议 来做。但如果出于某种原因,这个函数确实需要是一个生成器,你可以把它委托给另一个生成器;假设你想在结果列表后面加上某些内容,但只有在列表用完之后才加。
def foo():
list_ = ['a', 'b', 'c', 'd']
yield from list_
if something:
yield this
yield that
yield something_else
不过在 Python 3.3 之前的版本中,你不能使用这种语法;你需要像问题中那样,使用一个 for 循环和一个单独的 yield 语句来实现。
另外,你也可以把生成器放在一个普通的函数里,然后返回 chain
的结果:这样做的好处是可以在 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())
40
使用 iter
可以创建一个列表的迭代器,比如这样:
return iter(List)
不过,如果你已经有一个列表了,其实可以直接返回这个列表,这样会更高效。