在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升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python抽象类的新写法
Jun 18 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
Python生成器generator原理及用法解析
Jul 20 Python
python 如何引入协程和原理分析
Nov 30 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP chop()函数讲解
2019/02/11 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
JsDom 编程小结
2011/08/09 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
Python实用日期时间处理方法汇总
2015/05/09 Python
python编程嵌套函数实例代码
2018/02/11 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
电气自动化求职信
2014/06/24 职场文书
小学生差生评语
2014/12/29 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python