在Python的循环体中使用else语句的方法


Posted in Python onMarch 30, 2015

本文讨论Python的for…else和while…else语法,这是Python中最不常用、最为误解的语法特性之一。

Python中的for、while循环都有一个可选的else分支(类似if语句和try语句那样),在循环迭代正常完成之后执行。换句话说,如果我们不是以除正常方式以外的其他任意方式退出循环,那么else分支将被执行。也就是在循环体内没有break语句、没有return语句,或者没有异常出现。考虑一个简单的(无用的)例子:
 

>>> for i in range(5):
...   print(i)
... else:
...   print('Iterated over everything <img src="http://python.jobbole.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley"> ')
...
0
1
2
3
4
Iterated over everything <img src="http://python.jobbole.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley">

上面的代码中,我们在range(5)上迭代并打印每个数字。因为我们让循环正常完成,所以else分支也被执行,并打印出Iterated over everything :) 。相反,如果我们用break语句终止循环,那么else分支将不会执行:
 

>>> for i in range(5):
...   if i == 2:
...     break
...   print(i)
... else:
...   print('Iterated over everything <img src="http://python.jobbole.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley"> ')
...
0
1

注意,尽管循环所迭代的序列是空的,else分支依然会被执行,毕竟循环仍然是正常完成的。
 

>>> for i in []:
...   print(i)
... else:
...   print('Still iterated over everything (i.e. nothing)')
...
Still iterated over everything (i.e. nothing)

同样不要忘记,以上所有也适应于while…else:
 

>>> i = 0
>>> while i <= 5:
...   i += 1
...   print i
... else:
...   print 'Yep'
...
1
2
3
4
5
Yep

但是,为什么呢!?

else语句在循环中的一个常见使用案例是实现循环查找。假说你在查找一个满足特定条件的项目(item),同时需要进行附加处理,或者在未发现可接受的值时生成一个错误:
 

for x in data:
  if meets_condition(x):
    break
else:
  # raise error or do additional processing

没有else语句的话,你需要设置一个标志,然后在后面对其检测,以此确定是否存在满足条件的值。
 

condition_is_met = False
for x in data:
  if meets_condition(x):
    condition_is_met = True
 
if not condition_is_met:
  # raise error or do additional processing

这不是一个真正重要的东西,而在许多其他语言中你必须要如此做。但是类似Python的许多其他特性,else语句可以生成更加优雅的Python风格的(Pythonic)代码。毫无疑问,上面的例子中,使用else语句使得代码更加The Zen of Python友好:

这并不是说你不得不在循环中使用else语句,你总是可以使用标志等等。但是else语句常常可以使代码更加优雅、更具可读性。你可能认为这样Pythonic,而且使意图更加清楚(嗨!),然而其他人可能认为这样有迷惑性,而且冗余!个人来说,我坚持在循环中使用else语句,除非存在另一个更具可读性的方法(我想,对我来说,代码的可读性是最重要的)。

Python 相关文章推荐
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
Python中一行和多行import模块问题
Apr 01 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
python里dict变成list实例方法
Jun 26 Python
python 图片去噪的方法示例
Jul 09 Python
利用python实现AR教程
Nov 20 Python
python实现布隆过滤器及原理解析
Dec 08 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 Python
python实现2048小游戏
Mar 30 #Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 #Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 #Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 #Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 #Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 #Python
Python中利用函数装饰器实现备忘功能
Mar 30 #Python
You might like
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
php反射应用示例
2014/02/25 PHP
php简单日历函数
2015/10/28 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
Javascript Select操作大集合
2009/05/26 Javascript
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
浅谈React组件之性能优化
2018/03/02 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
python批量修改图片大小的方法
2018/07/24 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
记者岗位职责
2014/01/06 职场文书
网络技术专业求职信
2014/02/18 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
个人租房协议书
2014/11/28 职场文书
国家助学金感谢信
2015/01/21 职场文书
公司仓库管理制度
2015/08/04 职场文书
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android