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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
python 除法保留两位小数点的方法
Jul 16 Python
numpy中loadtxt 的用法详解
Aug 03 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
PyTorch中的torch.cat简单介绍
Mar 17 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
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
详解Nodejs内存治理
2018/05/13 NodeJs
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
写好自荐信要注意的问题
2013/11/10 职场文书
大学学习生活感言
2014/01/18 职场文书
四风问题查摆材料
2014/08/25 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
学校中秋节活动总结
2015/03/23 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
git中cherry-pick命令的使用教程
2022/06/25 Servers