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实现自动登录人人网并访问最近来访者实例
Sep 26 Python
python编程开发之textwrap文本样式处理技巧
Nov 13 Python
Python网络编程详解
Oct 31 Python
使用python为mysql实现restful接口
Jan 05 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
Jun 29 Python
Python之Sklearn使用入门教程
Feb 19 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
MVC模式的PHP实现
2006/10/09 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
Python使用剪切板的方法
2017/06/06 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
Python爬虫与反爬虫大战
2020/07/30 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
11月红领巾广播稿
2014/01/17 职场文书
小学生打架检讨书
2014/01/26 职场文书
年度考核自我鉴定
2014/02/02 职场文书
英文推荐信格式范文
2014/05/09 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
初中语文教学随笔
2015/08/15 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang