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的Flask框架中的signals信号机制
Jun 13 Python
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
使用Scrapy爬取动态数据
Oct 21 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
python中p-value的实现方式
Dec 16 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
Python实现UDP程序通信过程图解
May 15 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
python 使用openpyxl读取excel数据
Feb 18 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
人族 TERRAN 概述
2020/03/14 星际争霸
php 分页原理详解
2009/08/21 PHP
PHP 远程关机实现代码
2009/11/10 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
jquery实现图片预加载
2015/12/25 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
电气自动化个人求职信范文
2014/02/03 职场文书
2013年军训通讯稿
2014/02/05 职场文书
体育专业求职信
2014/07/16 职场文书
高中生学习计划书
2014/09/15 职场文书
个人务虚会发言材料
2014/10/20 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
2015年招生工作总结
2015/05/04 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python
总结几个非常实用的Python库
2021/06/26 Python