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中的并发编程实例
Jul 07 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
Python线程同步的实现代码
Oct 03 Python
python实现简单名片管理系统
Nov 30 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
通过实例解析Python调用json模块
Dec 11 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 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 header示例代码(推荐)
2010/09/08 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
win与linux系统中python requests 安装
2016/12/04 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
大学四年职业生涯规划书范文
2014/01/02 职场文书
《太阳》教学反思
2014/02/21 职场文书
村委会换届选举方案
2014/05/03 职场文书
经济管理自荐书
2014/06/09 职场文书
社会工作专业求职信
2014/07/15 职场文书
公司股东出资证明书
2014/11/01 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书