退出for-loop

时间:2010-03-02 14:05:40

标签: python for-loop while-loop

我是python的新手,我想知道是否:

def func(self, foo):
    for foo in self.list:
        if foo.boolfunc(): return True
    return False

是一种很好的做法。

我可以退出上面的循环,还是应该使用while循环?是这样的吗?

def func(self, foo):  
    found = false
    while(not found & i < len(self.list)):
        found = foo.boolfunc()
        ++i
    return found

我的java教授警告我们永远不要在我们的循环中使用中断,但这在技术上不是休息而且更简洁,所以......是的

感谢

6 个答案:

答案 0 :(得分:14)

你的例子没有错,但最好写

def func(self, foo):
    return any(foo.boolfunc() for foo in self.list)

答案 1 :(得分:8)

应该提到在Python中for loops can have an else clause。 else子句仅在循环因列表耗尽而终止时执行。

所以你可以写:

def func(self):
    for foo in self.list:
        if foo.boolfunc():
            return True
    else:
        return False

答案 2 :(得分:6)

你的教授提倡一种名为“单点回报”的做法,它基本上表明任何代码块都应该只有一个退出点。循环中断与此有些不同,但通常是集中在一起。

这是一个有争议的观点,至少可以说,当然也不像“永远不会使用goto”那么强硬。这可能是值得他这样做的 - 你可以安抚他并且也看到两种方法的好处,但是大多数人可能对单点返回不是太严格,如果违反它会使他们的代码更具可读性。

答案 3 :(得分:5)

“提前退出”是一种完美的Pythonic风格(有保证的时候:gnibbler的答案正确地指出,对于你的特定用例,有一个内置的[[在Python 2.5和更好]],这是更好的)并且经常帮助实现Pythonic “扁平比嵌套更好”的目标。 for通常是在应用程序级别在Python中进行循环的正确方法:如果有任何复杂的循环逻辑(可能需要while),通常最好将其推送到辅助程序无论如何,发电机。

有时声称替代“单点退出”的优点包括存在可以执行清理的单个“退出瓶颈”。但是,由于异常始终是可能的,因此即使您拥有异常,也不会知道您的单return是一个独特的退出瓶颈:相反,确保良好清理的正确方法是with语句(在2.6或2.5中,带有“从未来导入”;对于旧版本的Python,更笨重但仍然有用的try / finally)。

Knuth的文章“使用Goto语句进行结构化编程”(pdf) - 一篇令人难以置信的,有远见的文章,从1974年开始被许多人认为是计算机科学的理想和实用的传奇 - 值得一读。任何怀疑文章对Python的适用性的人都应该考虑以下简短引用:

  

设备如缩进,而不是   分隔符,可能变得可行   表达当地的结构   源语言。

二十年在Python 1.0发布之前,Knuth 已经预见到了成为Python标志的关键语法方面(并且,独立地,{{3}比起Python早一点发布 - 与Knuth,Peyton Jones和van Rossum的个人讨论,我可以证明他们都声称这三个“分组缩进”的发明完全是彼此独立的,只是一个例子。 “伟大的思想相似” - 或者,用查尔斯堡的话说,“它只是蒸汽机时间”; - )。

包括提前退出在内的代码的正式证明当然不比具有单点退出的等效代码更难,如果没有别的,因为CorradoBöhm和Giuseppe Jacopini的着名证明显示了如何从任何流程图执行机械转换一个只包含序列,选择和重复(但当然转换后的程序 - 就像任何其他程序试图避免早期退出样式一样 - 容易产生比需要更多的嵌套,以及额外的布尔“状态”变量,这会干扰可读性,直接性和效率 - 使早期退出在支持它的语言中更加优越。)

答案 4 :(得分:2)

这是一种很好的做法。

  

我的java教授警告我们永远不要在循环中使用中断

为什么? “never”在计算机科学中是一个强有力的词,不应该被使用。 1)


1)除了“goto”......我们都有烦恼。 ; - )

答案 5 :(得分:-2)

“打破循环”很容易转向不良行为,因为它隐藏了循环的终止条件。

如果您的if语句具有中等复杂性,那么可能会不清楚循环所建立的后置条件。

如果退出条件明显,则提前退出是一种常见的语法优化。

如果你的退出条件是不明显,那么一个令人费解的,嵌套的,难以理解的if语句集对你有害无益。

确实,this SO question表明存在一个简单的try块会导致条件如此令人困惑,以至于产生了一段明显不正确的代码,无法轻松调试。

通常,所有“早退”事物(尤其是break语句)都会导致创建正式证明的问题。 (else语句也有类似的问题。)

如果您通过推断创建必要后置条件所需的语句来开发您的程序,那么您将永远不需要break或早期return,因为您无法使用break轻松创建这些语句形式方法。

另请注意,任何避免elsebreak的建议都会导致仇恨邮件和嘀嗒声。出于无法理解的原因,仔细查看一些编程结构是件坏事。

"else" considered harmful in Python?

如果具有return(或早期{{1}})的循环的退出条件不是显而易见,则需要重新设计以使其明显< /强>

在此示例中,它们明显,因此所呈现的特定示例没有问题。