耐人寻味的 for...else...语句

开发 开发工具
任何编程语言都提供了 if…else… 语句,表示如果(if)满足条件就做某件事,否则(else)就做另外一件事,然而,在 Python 中 else 不仅可以和 if 搭配使用,另一种特有的句法是 for…else …。

[[198572]]

老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”当晚,程序员老公手捧一个包子进了家门……老婆怒道:“你怎么就买了一个包子?”老公答曰:“因为看到了卖西瓜的。”

程序员买西瓜的笑话可能大部分读者都知道,今天写的这篇文章和这个笑话有一定的关系。

任何编程语言都提供了 if…else… 语句,表示如果(if)满足条件就做某件事,否则(else)就做另外一件事:

  1. if a==b: 
  2.     print("true") 
  3.  
  4. else: 
  5.     print("false") 

然而,在 Python 中 else 不仅可以和 if 搭配使用,另一种特有的句法是 for…else …,它还可以和 while、try…except 组合使用,例如:

  1. for i in range(3): 
  2.     print(i) 
  3. else: 
  4.     print("end") 
  5.  
  6. >>> 
  7. end 

但是,你会发现 for…else… 与 if…else… 表现得不一样,按照以往经验来说,执行了 for 语句块的代码就不执行 else 里面了,反之亦然。

然而,我们看到的却恰恰相反,for 循环结束之后接着又执行了 else 语句块,这就有点意思了,if … else … 翻译成大白话就是 如果…否则…,而 for…else… 翻译成白话成了 直到… 然后 …,为什么不把它写成 for…then… 的句式呢?

for 循环遍历空列表也会执行 else 语句块,因为它是正常退出 for 循环的一种特例情况。

  1. for i in []: 
  2.     print(i) 
  3. else: 
  4.     print("end") 
  5.  
  6. >>> 

继续探索,我们用 break 提前终止 for 循环

  1. for i in range(3): 
  2.     print(i) 
  3.     if i % 2 == 0: 
  4.         break 
  5. else: 
  6.     print("end") 
  7.  
  8. >>> 

循环遇到 break 退出后,整个语句就结束,else 语句块也不执行了。

综上,我们可以得出这样一个结论,只有当循环里没有遇到 break 时,else 块才会执行。

Python 之父为什么要搞出这样的一种语法糖出来呢?这是我们常人没法理解的。不过「python之禅」告诉了我们答案: “Although that way may not be obvious at first unless you’re Dutch.”。

带着这个问题,我也在 StackOver Flow 找了一下答案,在平时的开发中真的很少有 for…else… 的应用场景,不过,像下面这种场景用 for else 还真是一种 pythonic 的用法。

当你用 for 循环迭代查找列表的中的某个元素时,如果找到了就提前退出,如果迭代完了还没找到需要以另外一种形式通知调用者时,用 for else 无疑是***的选择。

  1. for i in mylist: 
  2.     if i == target: 
  3.         break 
  4.     process(i) 
  5. else: 
  6.     raise ValueError("List argument missing terminal flag.") 

如果不用 for…else… , 那么还需要专门建立一个临时标记变量来标记是否已经找到了

  1. found = False 
  2. for i in mylist: 
  3.     if i == target: 
  4.         found = True 
  5.         break 
  6.     process(i) 
  7.  
  8. if not found: 
  9.     raise ValueError("List argument missing terminal flag.") 

当你想在房间里找某样东西时,只要在任意位置找到了,就停止继续搜查工作。但如果把整个房间都翻遍了,还没找到我们想要的东西,需要告诉人家说:这儿没有你要找的东西。遇到这样的情况用 for … else ,除此之外,***不要用它。

【本文是51CTO专栏作者“刘志军”的原创文章,作者微信公众号:Python之禅(VTtalk)】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2021-07-15 13:11:46

物联网平台物联网IOT

2011-05-23 16:23:18

Pythonelse

2021-02-25 09:35:32

语句elsePython

2020-08-21 13:20:36

C++If ElseLinux

2023-03-30 13:47:11

AI

2023-08-11 15:46:40

BashIf Else 语句

2020-11-23 09:37:22

Python开发函数

2013-07-01 14:45:10

iOS7越狱

2019-04-08 14:30:34

2024-06-18 18:36:03

2022-12-09 07:58:52

Bash条件语句

2022-04-12 07:32:40

引擎模式Spring策略模式

2013-11-27 09:38:31

云计算虚拟化

2020-07-17 13:01:44

If-Else代码编程

2012-04-13 10:11:22

Java

2024-11-04 09:41:47

2013-11-27 09:16:28

编程结构

2023-11-23 23:57:05

2016-10-11 20:33:17

JavaScriptThisWeb

2011-05-23 09:21:08

点赞
收藏

51CTO技术栈公众号