当前位置: 首页 > 科技观察

发人深省的for...else...语句

时间:2023-03-14 10:05:35 科技观察

老婆给程序员老公打电话:“下班路上买一斤包子带回来,看到西瓜就买一个。”“那天晚上,程序员老公何某手里拿着一个包子走进了家门……老婆气呼呼地说:“你怎么就买了个包子?”丈夫回答:“因为看到有人卖西瓜。”大多数读者可能都知道程序员买西瓜的笑话。这篇文章写的跟笑话有点关系。任何编程语言都提供了if...else...语句,意思是如果(if)满足条件就做某事,否则(else)做另一件事:ifa==b:print("true")else:print("false")但是在Python中,else不仅仅可以和if一起使用,还有一个独特的语法是for...else...,它也可以和while、try...except、for结合使用示例:foriinrange(3):print(i)else:print("end")>>>012end但是,您会发现for...else...和if...else...的行为不同。按照以往的经验,for语句块中的代码是不会在else里面执行的,反之亦然。然而,我们看到的恰恰相反。for循环结束后执行else语句块,有点意思。if...else...翻译成白话就是if...otherwise...,for...else...翻译成白话Sountil...then...为什么不写成for..。然后...?遍历空列表的for循环也会执行else块,因为它是正常退出for循环的特例。foriin[]:print(i)else:print("end")>>>0继续探索,我们使用break提前终止for循环foriinrange(3):print(i)ifi%2==0:breakelse:print("end")>>>0循环遇到break退出,整个语句结束,不执行else语句块。综上所述,我们可以得出这样一个结论,只有在循环中没有遇到break时才会执行else块。Python之父为什么要搞出这么一个语法糖呢?这超出了我们的理解。但《Python之禅》告诉我们答案:“尽管除非你是荷兰人,否则一开始那种方式可能并不明显。”。带着这个问题,我也在StackOverFlow上搜索了答案。在平时的开发中,for...else...的应用场景确实很少,但是在下面的场景中使用forelse确实是一个pythonic的用法。当你使用for循环迭代查找列表中的元素时,如果找到了,就会提前退出。如果需要在迭代后以另一种形式通知调用者,使用forelse无疑是最好的选择。foriinmylist:ifi==target:breakprocess(i)else:raiseValueError("Listargumentmissingterminalflag.")如果不使用for...else...,那么需要创建一个临时标志变量来标记是否found=Falseforiinmylist:ifi==target:found=Truebreakprocess(i)ifnotfound:raiseValueError("Listargumentmissingterminalflag.")当你想在房间里找东西的时候,只要在任何地方找到,就停止搜索。但是如果我们找遍了整个房间都没有找到我们想要的东西,我们就需要告诉人们:这里没有你要找的东西。在这种情况下使用for...else,否则,绝对不要使用它。【本文为专栏作家“刘志军”原创文章,作者微信公众号:Python之禅(VTtalk)】点此阅读更多本作者好文