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通过pil将图片转换成黑白效果的方法
Mar 16 Python
Python itertools模块详解
May 09 Python
python实现黑客字幕雨效果
Jun 21 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
python调用百度语音REST API
Aug 30 Python
在Python中使用Neo4j的方法
Mar 14 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
python pycharm的安装及其使用
Oct 11 Python
python模块导入的方法
Oct 24 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
三种取消选中单选框radio的方法
2014/09/09 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
Python实现发送email的几种常用方法
2014/08/18 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
Python多线程原理与用法详解
2018/08/20 Python
Python3实现定时任务的四种方式
2019/06/03 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
采购经理岗位职责
2014/02/16 职场文书
合作协议书
2014/04/23 职场文书
设计大赛策划方案
2014/06/13 职场文书
会议室标语
2014/06/21 职场文书
法人委托书
2014/07/31 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
鲁迅故里导游词
2015/02/05 职场文书