在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多线程http下载实现示例
Dec 30 Python
python重试装饰器示例
Feb 11 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
Python求解正态分布置信区间教程
Nov 20 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 Python
python之django路由和视图案例教程
Jul 26 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 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删除数组中特定元素的两种方法
2013/07/02 PHP
php实现短信发送代码
2015/07/05 PHP
比Jquery的document.ready更快的方法
2010/04/28 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Django如何将URL映射到视图
2019/07/29 Python
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
英语师范专业毕业生自荐信
2013/09/21 职场文书
什么是岗位职责
2013/11/12 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
《逃家小兔》教学反思
2014/02/23 职场文书
百日安全活动总结
2014/05/04 职场文书
法律顾问服务方案
2014/05/15 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
党校学习心得体会范文
2014/09/09 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
Python中基础数据类型 set集合知识点总结
2021/08/02 Python