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 相关文章推荐
使用pdb模块调试Python程序实例
Jun 02 Python
Python中scatter函数参数及用法详解
Nov 08 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
Python如何给你的程序做性能测试
Jul 29 Python
Python pymsql模块的使用
Sep 07 Python
解决Python字典查找报Keyerror的问题
May 26 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代码简化
2010/02/08 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
python搜索指定目录的方法
2015/04/29 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
python实现远程控制电脑
2019/05/23 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
护士岗位职责
2014/02/16 职场文书
通报表扬范文
2015/01/17 职场文书
委托函范文
2015/01/29 职场文书
2015年教研工作总结
2015/05/23 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
高中语文教学反思范文
2016/02/16 职场文书
Python基础之hashlib模块详解
2021/05/06 Python