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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
python数据结构之二叉树的统计与转换实例
Apr 29 Python
Python实现将不规范的英文名字首字母大写
Nov 15 Python
python3调用R的示例代码
Feb 23 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
简单了解Django ContentType内置组件
Jul 23 Python
Python2与Python3的区别点整理
Dec 12 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
Python爬虫 简单介绍一下Xpath及使用
Apr 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
2015年车间主任工作总结
2015/05/21 职场文书