python for和else语句趣谈


Posted in Python onJuly 02, 2019

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

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

任何编程语言都提供了 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 i in []:
print(i)
else:
print("end")
>>>
end

继续探索,如果我们用 break 提前终止 for 循环,会发生什么?

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

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

综上,我们可以得出这样一个结论,只有当循环里没有遇到 break 时,else 块才会执行。此刻,你应该明白了,真正和 else 搭配使用的是 for 循环中的 break,break ... else ... 才是两个互斥的条件

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

在平时的开发中真的很少有 for...else... 的应用场景,不过,像下面这种场景用 for else 还真是一种 pythonic 的用法。

当你用 for 循环迭代查找列表的中的某个元素时,如果找到了就立刻退出循环,如果迭代完了列表还没找到需要以另外一种形式(比如异常)的方式通知调用者时,用 for...else... 无疑是最好的选择。

# https://stackoverflow.com/a/9980752/1392860
for i in mylist:
if i == target:
break
process(i)
else:
raise ValueError("List argument missing terminal flag.")

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

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

当你想在房间里找某样东西时,只要在任意位置找到了,就停止继续搜查工作。但如果把整个房间都翻遍了,还没找到我们想要的东西时,需要告诉人家,很抱歉,这儿没有你要找的东西。遇到这样的情况时就用 for ... else ,除此之外,恐怕只会引起误操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
Python实现直播推流效果
Nov 26 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
Python代码注释规范代码实例解析
Aug 14 Python
Python collections.deque双边队列原理详解
Oct 05 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 Python
python数字类型和占位符详情
Mar 13 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 #Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 #Python
python格式化输出保留2位小数的实现方法
Jul 02 #Python
Python 获取ftp服务器文件时间的方法
Jul 02 #Python
简单了解Python生成器是什么
Jul 02 #Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 #Python
使用python实现ftp的文件读写方法
Jul 02 #Python
You might like
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
2013/06/25 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
windows下python连接oracle数据库
2017/06/07 Python
django中的setting最佳配置小结
2017/11/21 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
联想德国官网:Lenovo Germany
2018/07/04 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
数字漫画:comiXology
2020/06/13 全球购物
管理建议书范文
2014/05/13 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
详解JS数组方法
2021/11/20 Javascript