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发送email的3种方法
Apr 28 Python
你应该知道的python列表去重方法
Jan 17 Python
Python探索之SocketServer详解
Oct 28 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
详解python 注释、变量、类型
Aug 10 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 Python
python实现简单飞行棋
Feb 06 Python
pytorch 查看cuda 版本方式
Jun 23 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
Python基于Faker假数据构造库
Nov 30 Python
python接口自动化框架实战
Dec 23 Python
Python中requests做接口测试的方法
May 30 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
python自动格式化json文件的方法
2015/03/11 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
python openpyxl使用方法详解
2019/07/18 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
全球虚拟主机商:HostGator
2017/02/06 全球购物
创伤外科专业推荐信范文
2013/11/19 职场文书
洗发露广告词
2014/03/14 职场文书
社区党建工作总结2015
2015/05/13 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript