ToB企服应用市场:ToB评测及商务社交产业平台

标题: 闲的蛋疼 - Python为何选择了for...else [打印本页]

作者: 农妇山泉一亩田    时间: 2022-9-16 17:15
标题: 闲的蛋疼 - Python为何选择了for...else
Python有一个for...else语法,它的写法如下
  1. for i in range(0,100):
  2.     if i == 3:
  3.         break
  4. else:
  5.     print("Not found")
复制代码
该语句表示:若for循环遍历完毕,则执行else部分的语句。也就是说上述代码不会有任何输出,而下述代码会输出“Not found”:
  1. for i in range(0,100):
  2.     pass
  3. else:
  4.     print("Not found")
复制代码
可以很容易地猜出这种语法通常是为了做如下替换的:
  1. # 正常写法
  2. found = False
  3. for i in range(0, 100):
  4.     if i == 3:
  5.         found = True
  6.         break
  7. if not found:
  8.     print("Not found")
  9. # for...else写法
  10. for i in range(0, 100):
  11.     if i == 3:
  12.         break
  13. else:
  14.     print("Not found")
复制代码
但这里要说的重点不是这个语法的用处,而是这个语法的关键字选择。实际上如果稍微了解一点编程元素的话,很可能参考if...else的用法,把for...else的意思理解为:如果循环没有正常执行完毕(即被break打断),则执行else部分。但从实际作用上来讲(即“循环正常执行完则执行else部分”),显然用for...then或者for...continue都是更好的选择。
那么为什么Python非常神奇地选择了用else作为关键字呢?突然想到后突然好奇,实在忍不住查了一下后发现一个个人认为最有说服力的是“因为while是if更普遍的形式”。例如对于如下if...else代码:
  1. if condition:
  2.     ...
  3. else:
  4.     ...
复制代码
实际上可以写为:
  1. while condition:
  2.     ...
  3.     break
  4. else:
  5.     ...
复制代码
也就是所if可以视为while的一个特殊形式,那么有趣的来了。
在上面的while...else中,如果没有break,那么只有当condition为false时才会终止循环那么,而当condition为false时,显然就会执行一次else部分。
即:如果没有遇到break则意味着else部分尚有机会执行。
另一方面,如果遇到了break,就意味着跳出了while...else块,也就是说不会再检查condition,自然也不会再执行else部分。
即:如果碰到了break则else部分不再会被执行。
然后又因为for是while的特殊性形式,所以...
 
另外Python也支持while...for循环,而这个这个看起来就比较符合直觉了:
  1. ok = True
  2. while ok:
  3.     ok = False
  4. else:
  5.     print("ABC")
复制代码
尽管如此,由于for...else的反直觉设计会让人迷惑,在实际中并不推荐使用,如果只是为了跳出,封装成函数return是更好的选择。如果真的要用,就写下注释。
 
【参考资料】:
【1】Why does python use 'else' after for and while loops?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4