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中static相关知识小结
Jan 02 Python
用python制作游戏外挂
Jan 04 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
python抓取搜狗微信公众号文章
Apr 01 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
python 使用shutil复制图片的例子
Dec 13 Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 Python
python函数调用,循环,列表复制实例
May 03 Python
python如何爬取动态网站
Sep 09 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
Python爬虫进阶之Beautiful Soup库详解
Apr 29 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 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设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
PHP echo()函数讲解
2019/02/15 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
jquery下checked取值问题的解决方法
2012/08/09 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
python 文件和路径操作函数小结
2009/11/23 Python
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
python基础教程之自定义函数介绍
2014/08/29 Python
决策树的python实现方法
2014/11/18 Python
python 多线程串行和并行的实例
2019/02/22 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
详解Django 时间与时区设置问题
2019/07/23 Python
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
社区党总支书记先进事迹材料
2014/01/24 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
2015中学教学工作总结
2015/07/22 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
如何用Python搭建gRPC服务
2021/06/30 Python
Python之基础函数案例详解
2021/08/30 Python