在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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
python中模块查找的原理与方法详解
Aug 11 Python
Python引用计数操作示例
Aug 23 Python
Python3 修改默认环境的方法
Feb 16 Python
详解python中的time和datetime的常用方法
Jul 08 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
pytorch中的inference使用实例
Feb 20 Python
python获取栅格点和面值的实现
Mar 10 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
Flask response响应的具体使用
Jul 15 Python
python数字图像处理之对比度与亮度调整示例
Jun 28 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
我的论坛源代码(一)
2006/10/09 PHP
php session应用实例 登录验证
2009/03/16 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
学习PHP session的传递方式
2016/06/15 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
jquery easyui使用心得
2014/07/07 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
Python中有趣在__call__函数
2015/06/21 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
python编写简单端口扫描器
2019/09/04 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
公司节能减排方案
2014/05/16 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
晶体管来复再生式二管收音机
2021/04/22 无线电
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android