在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控制台显示时钟的示例
Feb 24 Python
python中对list去重的多种方法
Sep 18 Python
Windows下python2.7.8安装图文教程
May 26 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
Dec 04 Python
openCV提取图像中的矩形区域
Jul 21 Python
一个入门级python爬虫教程详解
Jan 27 Python
python实现简易自习室座位预约系统
Jun 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
PHP多个文件上传到服务器实例
2014/10/29 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
Python的设计模式编程入门指南
2015/04/02 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
Python分析学校四六级过关情况
2017/11/22 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
二手房购房意向书范本
2014/04/01 职场文书
《春笋》教学反思
2014/04/15 职场文书
产品质量保证书
2014/04/29 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
宾馆客房管理制度
2015/08/06 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers