the*_*ace 8 python for-loop while-loop
我是python的新手,我想知道这是否:
def func(self, foo):
for foo in self.list:
if foo.boolfunc(): return True
return False
Run Code Online (Sandbox Code Playgroud)
是好习惯.
我可以退出上面的循环,还是应该使用while循环,如此?
def func(self, foo):
found = false
while(not found & i < len(self.list)):
found = foo.boolfunc()
++i
return found
Run Code Online (Sandbox Code Playgroud)
我的java教授警告我们永远不要在我们的循环中使用中断,但这在技术上不是休息而且更简洁,所以......是的
谢谢
Joh*_*ooy 14
你的例子没有任何问题,但写作更好
def func(self, foo):
return any(foo.boolfunc() for foo in self.list)
Run Code Online (Sandbox Code Playgroud)
应该提到的是,在Python中,for循环可以有一个else子句.else子句仅在循环因列表耗尽而终止时执行.
所以你可以写:
def func(self):
for foo in self.list:
if foo.boolfunc():
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
你的教授正在倡导一种名为"单点返回"的做法,它基本上表明任何代码块都应该只有一个退出点.循环中断与此有些不同,但通常集中在一起.
至少可以说,这是一个有争议的观点,当然也不像"永远不会使用goto"那么严格和快速.这可能是值得他这样做的 - 你可以安抚他并且也看到两种方法的好处,但是大多数人可能对单点返回不是太严格,如果违反它会使他们的代码更具可读性.
"提前退出"是一种完美的Pythonic风格(当需要时:gnibbler的答案正确指出,对于您的特定用例,内置[[在Python 2.5和更好]]这是更可取的)并且通常有助于实现Pythonic的目标"扁平比嵌套好".并且for
通常是在应用程序级别在Python中进行循环的正确方法:如果有任何复杂的循环逻辑(可能需要保证while
),通常最好将其推送到辅助生成器.
对于替代的"单点退出"有时声称的优点包括存在可以执行清理的单个"退出瓶颈".但是,由于异常总是可能的,你不知道你的单一return
是一个独特的退出瓶颈,即使你拥有它:确保良好清理的正确方法是with
(在2.6或2.5中使用"import")从未来";对于旧版本的Python,笨重但仍然有用try
/ finally
相反).
Knuth的文章"使用Goto语句进行结构化编程" (pdf) - 一篇令人难以置信的,有远见的文章,从1974年开始被许多人认为是计算机科学的理想和实用的传奇 - 值得一读.任何怀疑文章对Python的适用性的人都应该考虑以下简短引用:
缩进而不是分隔符等设备可能在源语言中表达本地结构.
在Python 1.0发布二十年之前,Knuth 已经预见到了成为Python这一标志的关键语法方面(独立地,Haskell,比Python早一点发布 - 来自与Knuth,Peyton Jones和van的个人讨论)罗森,我可以证明他们都声称这三个"分组缩进"的发明完全是相互独立的,只是一个"伟大思想相似"的案例 - 或者用查尔斯堡的话来说,"它只是蒸汽引擎时间";-).
包括提前退出在内的代码的正式证明当然不比具有单点退出的等效代码更难,因为CorradoBöhm和Giuseppe Jacopini的着名证明显示了如何执行从任何流程图到包含任何流程图的机械转换只有序列,选择和重复(当然,转换后的程序 - 就像任何其他试图避免早期退出样式的程序一样 - 容易产生比需要更多的嵌套,以及额外的布尔"状态"变量,它会干扰可读性,直接性和效率 - 使早期退出在支持它的语言中更加出色.