在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的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
python使用range函数计算一组数和的方法
May 07 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
python实现SMTP邮件发送功能
Jun 16 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
python进行参数传递的方法
May 12 Python
python和C++共享内存传输图像的示例
Oct 27 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
深度学习详解之初试机器学习
Apr 14 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的面试题集
2006/11/19 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
javascript 面向对象编程基础:继承
2009/08/21 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python实现贪吃蛇小游戏
2020/03/21 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
Android interview questions
2016/12/25 面试题
触摸春天教学反思
2014/02/03 职场文书
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
元旦活动感言
2014/03/08 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
2014年关工委工作总结
2014/11/17 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书