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处理圆角图片、圆形图片的例子
Apr 25 Python
Python实现在线音乐播放器
Mar 03 Python
Python使用numpy实现BP神经网络
Mar 10 Python
python学生信息管理系统
Mar 13 Python
Python3基础教程之递归函数简单示例
Jun 07 Python
python文件处理fileinput使用方法详解
Jan 02 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
在keras中实现查看其训练loss值
Jun 16 Python
Python绘图之柱形图绘制详解
Jul 28 Python
Python判断字符串是否为合法标示符操作
Sep 03 Python
Django创建一个后台的基本步骤记录
Oct 02 Python
python内置模块之上下文管理contextlib
Jun 14 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设计模式中单例模式的应用分析
2013/05/15 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
python中Genarator函数用法分析
2015/04/08 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Flask框架信号用法实例分析
2018/07/24 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
高考考python编程是真的吗
2020/07/20 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
Python学习之time模块的基本使用
2021/01/17 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
个人投资计划书
2014/05/01 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
四年级小学生评语
2014/12/26 职场文书
颐和园的导游词
2015/01/30 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
python办公自动化之excel的操作
2021/05/23 Python