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去除文件中空格、Tab及回车的方法
Apr 12 Python
Python实现读取文件最后n行的方法
Feb 23 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
python opencv之SIFT算法示例
Feb 24 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
Python+OpenCV图像处理——图像二值化的实现
Oct 24 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 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快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
python微信公众号之关注公众号自动回复
2018/10/25 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Python几种常见算法汇总
2020/06/02 Python
keras实现多种分类网络的方式
2020/06/11 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
static关键字的用法
2013/10/07 面试题
广州迈达威.net面试题目
2012/03/10 面试题
幼儿园园长岗位职责
2013/11/26 职场文书
医药专业应届毕业生求职信范文
2014/01/01 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
学年个人总结范文
2015/03/05 职场文书
医院党建工作总结2015
2015/05/26 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript