在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入门篇之列表和元组
Oct 17 Python
Apache如何部署django项目
May 21 Python
Python从零开始创建区块链
Mar 06 Python
django 发送手机验证码的示例代码
Apr 25 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 Python
pyqt5实现登录界面的模板
May 30 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python实现图片批量压缩
Apr 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
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
js三种排序算法分享
2012/08/16 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
Python实现二分法算法实例
2015/02/02 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
基于python检查矩阵计算结果
2020/05/21 Python
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
小学生竞选班干部演讲稿
2014/04/24 职场文书
学校食堂标语
2014/10/06 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android
python套接字socket通信
2022/04/01 Python