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 相关文章推荐
python正则表达式抓取成语网站
Nov 20 Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
Python数据类型详解(一)字符串
May 08 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
对Python中内置异常层次结构详解
Oct 18 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
ipython和python区别详解
Jun 26 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
Python docutils文档编译过程方法解析
Jun 23 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 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扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
jQuery事件对象总结
2016/10/17 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
酒店副总岗位职责
2013/12/24 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
大学军训感言200字
2014/02/26 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
创建青年文明号材料
2014/05/09 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
公司离职证明样本
2014/09/13 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
Javascript的promise,async和await的区别详解
2022/03/24 Javascript
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS