在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中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
Python对列表的操作知识点详解
Aug 20 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
Python参数传递及收集机制原理解析
Jun 05 Python
Python模块常用四种安装方式
Oct 20 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 Python
如何利用Python写个坦克大战
Nov 18 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文件注释标记及规范小结
2012/04/01 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
Javascript模块模式分析
2008/05/16 Javascript
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
2017/11/06 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
使用Python的判断语句模拟三目运算
2015/04/24 Python
星球大战与Python之间的那些事
2016/01/07 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
Android interview questions
2016/12/25 面试题
大客户销售经理职责
2013/12/04 职场文书
联谊会主持词
2014/03/26 职场文书
社团活动总结怎么写
2014/06/30 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
JS代码编译器Monaco使用方法
2021/06/11 Javascript
总结一些Java常用的加密算法
2021/06/11 Java/Android