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中MySQLdb模块用法实例
Nov 10 Python
Python、Javascript中的闭包比较
Feb 04 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
Mar 30 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
使用Template格式化Python字符串的方法
Jan 22 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
简单了解python反射机制的一些知识
Jul 13 Python
为什么说Python可以实现所有的算法
Oct 04 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP 魔术函数使用说明
2010/05/14 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
关于laravel 子查询 & join的使用
2019/10/16 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
python中异常报错处理方法汇总
2016/11/20 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
tensorflow常用函数API介绍
2020/04/19 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
平面设计的岗位职责
2013/11/08 职场文书
委托书范本
2014/04/02 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
2014年度培训工作总结
2014/11/27 职场文书
五年级小学生评语
2014/12/26 职场文书
2019个人半年工作总结
2019/06/21 职场文书
MySQL时区造成时差问题
2022/04/13 MySQL