Python嵌套用于循环Vs生成器,用于重复迭代函数提供的列表

时间:2011-10-28 20:58:19

标签: for-loop iterator python

问题很简单,我有一个返回列表的方法。 我想迭代这个列表中的每个项目,一旦完成, 调用方法接收新列表,然后重复。

目前,我的代码看起来像是:

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():
        ...

虽然我以前的尝试在某些方面看起来更好,但我当前的方法有一些“优势”:

  • 如果Condition设置为false,则循环结束而不必从for循环中break
    • 上述原因的扩展,访问Condition的方法可以结束循环而不用遍历所述列表中的所有其他项目,或者在for循环中实现特殊检查。
  • 第一种方法允许在需要时跳过循环中的项目。
  • 还有一个较低级别的缩进。这比其他任何东西更虚荣,但考虑到实际代码是类方法的一部分,缩进级别已经非常高了。

至少可以说,混淆哪个更合适。他们似乎都有独特的优点和缺点,所以如果有人知道最正确和pythonic的方法,我真的很感激。

2 个答案:

答案 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。但这只是少数。