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标准库之Sys模块使用详解
May 23 Python
Python制作爬虫抓取美女图
Jan 20 Python
python记录程序运行时间的三种方法
Jul 14 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
Django权限机制实现代码详解
Feb 05 Python
Python实现的读写json文件功能示例
Jun 05 Python
python 字典 按key值大小 倒序取值的实例
Jul 06 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
Python 从相对路径下import的方法
Dec 04 Python
PyQt弹出式对话框的常用方法及标准按钮类型
Feb 27 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
如何通过python计算圆周率PI
Nov 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
PHP与已存在的Java应用程序集成
2006/10/09 PHP
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
js实现秒表计时器
2019/12/16 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python中偏函数partial用法实例分析
2015/07/08 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
幼儿教师研修感言
2014/02/12 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
运动员加油词
2015/07/18 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
初中班干部工作总结
2015/08/10 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
合作协议书格式范本
2016/03/21 职场文书
python实现双链表
2022/05/25 Python