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使用socket远程连接错误处理方法
Apr 29 Python
python画出三角形外接圆和内切圆的方法
Jan 25 Python
python实现简单flappy bird
Dec 24 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
在python tkinter界面中添加按钮的实例
Mar 04 Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 Python
Python爬取12306车次信息代码详解
Aug 12 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
python mock测试的示例
Oct 19 Python
深度学习tensorflow基础mnist
Apr 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
将PHP作为Shell脚本语言使用
2006/10/09 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
用JS实现的一个include函数
2007/07/21 Javascript
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
利用python代码写的12306订票代码
2015/12/20 Python
python实现彩色图转换成灰度图
2019/01/15 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
程序员机试试题汇总
2012/03/07 面试题
测试时代收集的软件测试面试题
2013/09/25 面试题
计算机求职自荐信范文
2014/04/19 职场文书
家长给学校的建议书
2014/05/15 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
黄石寨导游词
2015/02/05 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
正则表达式基础与常用验证表达式
2022/06/16 Javascript
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python