Python的for和break循环结构中使用else语句的技巧


Posted in Python onMay 24, 2016

在Python中的while或者for循环之后还可以有else子句,作用是for循环中if条件一直不满足,则最后就执行else语句。

for i in range(5):
 if i == 1:
  print 'in for'
else:
 print 'in else'

print 'after for-loop'

# in for
# in else
# after for-loop

但我们发现if条件在循环的过程中成立了,最终还是执行了else语句里的内容,这是为什么呢?

好的,我们这时看下面这段程序:

for i in range(5):
 if i == 1:
  print 'in for'
  break
else:
 print 'in else'

print 'after for-loop'


# in for
# after for-loop

我们在if里添加了一个break,这是因为else是在for后执行的,但只有for循环正常退出时才会执行else语句(不是由break结束循环)。而当循环是由break语句中断时,else就不被执行。

for/else等效于下面这段代码,可以类似C语言那样添加一个flag:

found = False
for i in range(5):
 if i == 1:
  found = True
  print 'in for'
if not found:
 print 'not found'

print 'after for-loop'


# in for
# after for-loop

与for语句相似,while语句中的else子句用法是一样的,else块在循环正常结束和循环条件不成立时执行。

对于条件语句 if- else 我们已经很熟悉了, 但是在Python中,for-else用于处理遍历失败。

比如我们要实现这样一个功能:找出(81,99)中最大的完全平方数并输出,找不到则输出提示。

如果用c++的for循环实现,必须手动的判断for循环是否遍历失败:

#include <iostream> 
#include<math.h> 
using namespace std; 
int main() 
{ 
 int i; 
 float n; 
 for(i=99;i>81;i--) 
 { 
  n=sqrt((float)i); 
  if(n==int(n)) 
  { 
   cout<<i; 
   break; 
  } 
 } 
 if(i==81) //边界判断 
  cout<<"didn't find it!"<<endl; 
 return 0; 
}

而用Python的for-else则可简单的实现这一功能:

from math import sqrt 
for n in range(99,81,-1): 
 root = sqrt(n) 
 if root == int(root): 
  print n 
  break 
else: 
 print"Didn't find it!"

在for循环完整完成后才执行else;如果中途从break跳出,则连else一起跳出。

特别需要注意的是如果for中有if语句,else的缩进一定要和for对齐,如果和if对齐,则变成if-else语句,会产生意想不到的错误如下:

from math import sqrt 
for n in range(99,81,-1): 
 root = sqrt(n) 
 if root == int(root): 
  print n 
  break 
 else: 
  print"Didn't find it!"

虽然使用for-else节省两行代码同时便于阅读,但是容易和if-else混淆。貌似实际中不会常用,反而更倾向于手动处理。

Python 相关文章推荐
python通过urllib2获取带有中文参数url内容的方法
Mar 13 Python
Python 探针的实现原理
Apr 23 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
python机器学习实战之K均值聚类
Dec 20 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
Python动态生成多维数组的方法示例
Aug 09 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
基于python实现从尾到头打印链表
Nov 02 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 Python
详解MindSpore自定义模型损失函数
Jun 30 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 #Python
用Python写一个无界面的2048小游戏
May 24 #Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 #Python
Python中set与frozenset方法和区别详解
May 23 #Python
python实现多线程的两种方式
May 22 #Python
python实现简单购物商城
May 21 #Python
python字符串的常用操作方法小结
May 21 #Python
You might like
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
SMARTY学习手记
2007/01/04 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
PHP中list方法用法示例
2016/12/01 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
python实现简单ftp客户端的方法
2015/06/28 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
现金会计岗位职责
2013/12/05 职场文书
青年教师培训方案
2014/02/06 职场文书
班级旅游计划书
2014/05/03 职场文书
服务标兵事迹材料
2014/05/04 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
史上最牛辞职信
2015/05/13 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书