问题很简单,我有一个返回列表的方法。 我想迭代这个列表中的每个项目,一旦完成, 调用方法接收新列表,然后重复。
目前,我的代码看起来像是:
generator = iter([])
while Condition:
try:
item = next(generator)
except StopIteration:
generator = iter(list_returining_method())
item = next(generator)
...
但是,之前我使用的是嵌套的for
循环。
while Condition:
for item in list_returining_method():
...
虽然我以前的尝试在某些方面看起来更好,但我当前的方法有一些“优势”:
break
。
至少可以说,混淆哪个更合适。他们似乎都有独特的优点和缺点,所以如果有人知道最正确和pythonic的方法,我真的很感激。
答案 0 :(得分:2)
我建议你使用一些迭代器
items = itertools.chain.from_iterable( iter(list_returning_method, None) )
for item in items:
# do something with item
print item
if not Condition:
break
iter(callable, sentinel)
返回一个迭代器,它产生callable()的结果,直到它返回sentinel。
itertools.chain.from_iterable
返回一个展平原始迭代器的迭代器,它将生成第一个迭代器生成的列表中的值。
我认为这可以为您提供方法的大部分优势,但风格更清晰。
答案 1 :(得分:1)
这里有意见空间,但就我而言,第二种方法的简洁使其成为一个明显的胜利。特别是如果item
变量的使用仅限于循环内,我每次都会选择for / in语法。存在一些问题,包括循环内的缓冲区和状态变化,我选择不使用for / in。但这只是少数。