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笔记(2)
Oct 24 Python
python33 urllib2使用方法细节讲解
Dec 03 Python
以一段代码为实例快速入门Python2.7
Mar 31 Python
python三方库之requests的快速上手
Mar 04 Python
python操作日志的封装方法(两种方法)
May 23 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
详解MindSpore自定义模型损失函数
Jun 30 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安装问题
2006/10/09 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
IE和Firefox下event事件杂谈
2009/12/18 Javascript
js更优雅的兼容
2010/08/12 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
checkbox使用示例
2013/08/23 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
python实现线程池的方法
2015/06/30 Python
Django返回json数据用法示例
2016/09/18 Python
Python中几种导入模块的方式总结
2017/04/27 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
银行授权委托书样本
2014/10/13 职场文书
中职班主任培训心得体会
2016/01/07 职场文书