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 截取 取出一部分的字符串方法
Mar 01 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python可以实现栈的结构吗
May 27 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
Python json解析库jsonpath原理及使用示例
Nov 25 Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 Python
写好Python代码的几条重要技巧
May 21 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
浅谈PHP中的那些魔术常量
2020/12/02 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
JavaScript截屏功能的实现代码
2017/07/28 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
Delphi笔试题
2016/11/14 面试题
试用期自我评价怎么写
2015/03/10 职场文书
公路施工安全责任书
2015/05/08 职场文书
毕业实习证明范本
2015/06/16 职场文书