在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通过apply使用元祖和列表调用函数实例
May 26 Python
深入理解Python变量与常量
Jun 02 Python
python模块之paramiko实例代码
Jan 31 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
pytorch 共享参数的示例
Aug 17 Python
Python time库基本使用方法分析
Dec 13 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
python实现对变位词的判断方法
Apr 05 Python
python 自动识别并连接串口的实现
Jan 19 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 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
Python3中的json模块使用详解
2018/05/05 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python入门之井字棋小游戏
2020/03/05 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
super()与this()的区别
2016/01/17 面试题
个人求职简历的自我评价
2013/10/19 职场文书
企业管理标语
2014/06/10 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
Python循环之while无限迭代
2022/04/30 Python