在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实现类的静态变量用法实例
May 08 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
Python获取系统默认字符编码的方法
Jun 04 Python
浅谈Python中range和xrange的区别
Dec 20 Python
在python中安装basemap的教程
Sep 20 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
使用python对excle和json互相转换的示例
Oct 23 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
pycharm代码删除恢复的方法
Jun 26 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
给多个地址发邮件的类
2006/10/09 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
解决React Native端口号修改的方法
2017/07/28 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python将txt文件读取为字典的示例
2018/12/22 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
企业承诺书格式
2014/05/21 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
公司开会通知
2015/04/20 职场文书
企业催款函范本
2015/06/24 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python