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实现从脚本里运行scrapy的方法
Apr 07 Python
Python机器学习之SVM支持向量机
Dec 27 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
对pytorch的函数中的group参数的作用介绍
Feb 18 Python
Python中的整除和取模实例
Jun 03 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
Python中bisect的用法及示例详解
Jul 20 Python
python 实现音频叠加的示例
Oct 29 Python
详解Python如何批量采集京东商品数据流程
Jan 22 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统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
JS 图片缩放效果代码
2010/06/09 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
Python图像处理之简单画板实现方法示例
2018/08/30 Python
对Python中内置异常层次结构详解
2018/10/18 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
python线程join方法原理解析
2020/02/11 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
高一地理教学反思
2014/01/18 职场文书
工程材料采购方案
2014/05/18 职场文书
供应链金融服务方案
2014/05/25 职场文书
企业口号大全
2014/06/12 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
MySQL快速插入一亿测试数据
2021/06/23 MySQL
python代码实现扫码关注公众号登录的实战
2021/11/01 Python
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers