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导入oracle数据的方法
Jul 10 Python
详解Django中的过滤器
Jul 16 Python
python实现的正则表达式功能入门教程【经典】
Jun 05 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
python pygame模块编写飞机大战
Nov 20 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
代码详解django中数据库设置
Jan 28 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
Python统计时间内的并发数代码实例
Dec 28 Python
Python tkinter模版代码实例
Feb 05 Python
Python自动化测试基础必备知识点总结
Feb 07 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
PHP 错误之引号中使用变量
2009/05/04 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
JQuery UI皮肤定制
2009/07/27 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
Python3多线程操作简单示例
2018/05/22 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
十佳好少年事迹材料
2014/08/21 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
故宫的导游词
2015/01/31 职场文书
五年级作文之成长
2019/09/16 职场文书