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

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

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

if a==b:print("true")else:print("false")

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

for i in range(3):print(i)
else:print("end")>>>
0
1
2
end

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

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

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

for i in []:print(i)
else:print("end")>>>
0

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

for i in range(3):print(i)if i % 2 == 0:break
else:print("end")>>>
0

循环遇到 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 无疑是最好的选择。

for i in mylist:if i == target:breakprocess(i)
else:raise ValueError("List argument missing terminal flag.")

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

found = False
for i in mylist:if i == target:found = Truebreakprocess(i)if not found:raise ValueError("List argument missing terminal flag.")

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

推荐阅读:


关注Python之禅,提高Python技术

耐人寻味的 for...else...语句相关推荐

  1. Python爱好者社区历史文章列表(每周append更新一次)

    2月22日更新:   0.Python从零开始系列连载: Python从零开始系列连载(1)--安装环境 Python从零开始系列连载(2)--jupyter的常用操作 Python从零开始系列连载( ...

  2. 一个SQL语句引发的ORA-00600错误排查(一) (r9笔记第64天)

    最近有一个同事问我一个问题,说他运行一个SQL语句抛出了ORA-00600的错误,想让我帮忙分析一下,这种问题听了确实有兴趣,了解了问题的大体情 况之后,发现这个问题还是值得分析分析的,因为只是客户端 ...

  3. Python 上下文管理器和 with 语句

    1. 上下文管理器概念 什么是 Python 的上下文管理器(Context Managers)呢? ​ 含有 __enter__ 和 __exit__ 方法的对象就是.上下文管理器存在的目的是管理 ...

  4. Go 学习笔记(62)— Go 中 switch 语句中的 switch 表达式和 case 表达式之间的关系

    switch 语句对 switch 表达式的结果类型,以及各个 case 表达式中子表达式的结果类型都是有要求的. 毕竟,在 Go 语言中,只有类型相同的值之间才有可能被允许进行判等操作. 1. sw ...

  5. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符

    1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...

  6. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)

    1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then ​ commands fi 或者 if command; t ...

  7. Python学习--not语句

    布尔型True和False,not True为False,not False为True,以下是几个常用的not的用法: (1) not与逻辑判断句if连用,代表not后面的表达式为False的时候,执 ...

  8. 合肥工业大学—SQL Server数据库实验八:使用聚集函数的SELECT语句

    在数据库EDUC中用SQL语句实现如下查询: 1) 查询学生的总人数 -- 查询学生的总人数 select count(*) from student select count(1) from stu ...

  9. 合肥工业大学—SQL Server数据库实验三:SQL语句创建和删除基本表

    SQL语句创建和删除基本表 1. 编写6个基本表 2. 修改基本表结构,完整性约束条件 3. 用Drop table 语句删除基本表 1. 编写6个基本表 设有简单教学管理的6个关系模式如下: 系(系 ...

最新文章

  1. CSS结构选择器四种结构关系的范围
  2. 3月Win 10美占有率超20% 免费升级是否延长受关注
  3. pring MVC过滤器-HttpPutFormContentFilter
  4. python控制流_Python学习--控制流
  5. 如何给计算机主机进行静电导流,一种具有高散热性的计算机主机箱的制作方法...
  6. Feign的构建过程及自定义扩展功能
  7. Good Bye 2021: 2022 is NEAR A-Integer Diversity(水题)
  8. MAVLink 协议解析之XML定义篇
  9. JAXB 遇到的问题
  10. hadoop2.2.0 core-site.xml--global properties
  11. 七种滤波方法测试matlab
  12. FZU 2213 Common Tangents(公切线)
  13. 量化投资与python语言_在量化投资领域,为什么Python如此受欢迎?
  14. Elasticsearch Index Lifecycle Management (ILM)
  15. 数据如何变成知识(2):数据湖和数据沼泽
  16. 婚纱照姿势怎么摆 三大技巧帮您解决烦恼
  17. 2022/1/14总结
  18. ATmega8/16/32/64/128中文参考手册
  19. HTTP协议与FTP协议的区别
  20. 股票自选股程序编辑简介

热门文章

  1. 视频教程-Scratch3.0趣味编程L3X-大型案例《王者荣耀》-其他
  2. 【无标题】乘法口诀表
  3. MySQL——初窥门径
  4. 线性回归:天猫双十一销量预测
  5. 集成墙面和瓷砖,装修到底该选谁?
  6. 贵州省大数据发展管理局到访法大大交流指导
  7. 教程|企业和个体户如何开通视频号小店
  8. 基于HSIC-GL的多元时间序列非线性Granger因果关系分析
  9. Peluso话筒现场录音,信号链和后期处理演示
  10. 网页制作-技术学习笔记