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实现获取客户机上指定文件并传输到服务器的方法
Mar 16 Python
利用python获取Ping结果示例代码
Jul 06 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
Python爬虫学习之翻译小程序
Jul 30 Python
解决Python二维数组赋值问题
Nov 28 Python
Python enumerate内置库用法解析
Feb 24 Python
django为Form生成的label标签添加class方式
May 20 Python
python 实现控制鼠标键盘
Nov 27 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
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
PHP序列化操作方法分析
2016/09/28 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
简单的分页代码js实现
2016/05/17 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
Python open读写文件实现脚本
2008/09/06 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
学习python需要有编程基础吗
2020/06/02 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
工作的心得体会
2013/12/31 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
交通安全寄语大全
2014/04/08 职场文书
青春奉献演讲稿
2014/05/08 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
结婚通知短信大全
2015/04/17 职场文书