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

For loop Python嵌套for循环Vs生成器,用于在函数提供的列表上重复迭代,for-loop,iterator,python,For Loop,Iterator,Python,问题很简单,我有一个返回列表的方法。 我想迭代列表中的每一项,一旦完成, 调用该方法以接收新列表,然后重复 目前,我的代码看起来像: generator = iter([]) while Condition: try: item = next(generator) except StopIteration: generator = iter(list_returining_method()) item = next(generato

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

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

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():
        ...
虽然我以前的尝试在某些方面看起来更好,但我目前的方法有一些“优点”:

  • 如果条件设置为false,则循环结束,而不必断开for循环。
    • 上述原因的扩展,具有条件访问权限的方法可以结束循环,而无需检查所述列表中的所有其他项,或在for循环中执行特殊检查
  • 第一种方法允许在需要时跳过循环中的项目
  • 还有一个层次的缩进。这比其他任何东西都更虚荣,但考虑到实际代码是类方法的一部分,缩进级别已经相当高了

至少可以说,我不知道哪个更合适。它们似乎都有独特的优缺点,因此,如果有人知道最正确和最具Python风格的方法,我将非常感激。

这里有发表意见的空间,但第二种方法的简洁性使我认为这是一个明显的胜利。特别是如果
变量的使用仅限于循环内,我每次都会选择for/in语法。出现了一些问题,涉及循环中的缓冲区和状态更改,我选择不使用for/in。但这只是少数。我建议您使用一些迭代器

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
返回一个将原始迭代器展平的迭代器,它将在第一个迭代器生成的列表中生成值


我认为这将为您提供您的方法的大部分优点,但风格更简洁。

这非常有效。虽然第一行最初看起来很神秘,但这是一个更好的解决方案。我看到的唯一问题是,何时需要将参数传递给callable。关于如何解决这个问题有什么建议吗?@SingularityCat,有两种选择。您可以使用functools.partial,它结合函数和参数来创建新函数。或者你可以写一个生成器。