在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操作mysql中文显示乱码的解决方法
Oct 11 Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
python简单的函数定义和用法实例
May 07 Python
Python使用turtule画五角星的方法
Jul 09 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
python+opencv实现动态物体识别
Jan 09 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
python异步实现定时任务和周期任务的方法
Jun 29 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 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
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
服务器web工具 php环境下
2010/12/29 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
php操作MongoDB类实例
2015/06/17 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
python类参数self使用示例
2014/02/17 Python
使用PDB模式调试Python程序介绍
2015/04/05 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
python实现扫描ip地址的小程序
2019/04/16 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
调查研究项目计划书
2014/04/29 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书