假设我有一个列表,希望不返回整个列表,而是从中生成值。最符合Pythonic风格的方法是什么?
这就是我的意思。由于一些非惰性计算,我已经计算出了列表['a','b','c','d']
,但是我的项目代码使用了惰性计算,因此我想从我的函数中生成值,而不是返回整个列表。
目前我已经将它写成以下形式:
my_list = ['a', 'b', 'c', 'd']
for item in my_list:
yield item
但这种写法对我来说不太符合Python的编程风格。
由于这个问题没有具体说明,我将提供一个适用于Python >= 3.3的答案。
如果你只需要返回那个列表,请按照Anurag建议的方式操作,但是如果出于某些原因,所需函数确实需要成为生成器,那么可以委托给另一个生成器;假设你想给结果列表添加后缀,但只有在列表首次耗尽时才添加。
def foo():
list_ = ['a', 'b', 'c', 'd']
yield from list_
if something:
yield this
yield that
yield something_else
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)
如果你已经有一个列表,直接返回该列表会更有效率。
iter
是完全多余的,这是过度设计。 - mswiter
虽然有些过度,但并非完全冗余。它可以用于记住在迭代列表时你的位置,并将其传递下去。使用列表时,你还需要传递一个索引值。 - Anurag Uniyal(x for x in List)
return (x for x in list)
? - bodacydo
for i in my_iterable:
这样的代码,那么它会像一个生成器一样遍历并输出结果。 - msw