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编写基于DHT协议的BT资源爬虫
Mar 19 Python
Python正则表达式常用函数总结
Jun 24 Python
python之Character string(实例讲解)
Sep 25 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
详解python中@的用法
Mar 27 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
Python3.7 pyodbc完美配置访问access数据库
Oct 03 Python
Django+Celery实现动态配置定时任务的方法示例
May 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
php 结果集的分页实现代码
2009/03/10 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
php获取系统变量方法小结
2015/05/29 PHP
yii分页组件用法实例分析
2015/12/28 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
Python中的tuple元组详细介绍
2015/02/02 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
python学生信息管理系统实现代码
2019/12/17 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
美容院店长岗位职责
2014/04/08 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
教师培训学习心得体会
2016/01/21 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
vue3中provide && inject的使用
2021/07/01 Vue.js
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL