Python中在for循环中嵌套使用if和else语句的技巧


Posted in Python onJune 20, 2016

for...[if]...构建List (List comprehension)
1.简单的for...[if]...语句
Python中,for...[if]...语句一种简洁的构建List的方法,从for给定的List中选择出满足if条件的元素组成新的List,其中if是可以省略的。下面举几个简单的例子进行说明。

>>> a=[12, 3, 4, 6, 7, 13, 21]
>>> newList = [x for x in a]
>>> newList
[12, 3, 4, 6, 7, 13, 21]
>>> newList2 = [x for x in a if x%2==0]
>>> newList2
[12, 4, 6]

省略if后,newList构建了一个与a具有相同元素的List。但是,newList和a是不同的List。执行b=a,b和newList是不同的。newList2是从a中选取满足x%2==0的元素组成的List。如果不使用for...[if]..语句,构建newList2需要下面的操作。

>>> newList2=[]
>>> for x in a:
...  if x %2 == 0:
...    newList2.append(x)
>>> newList2
[12, 4, 6]

显然,使用for...[if]...语句更简洁一些。

2.嵌套的for...[if]...语句
嵌套的for...[if]...语句可以从多个List中选择满足if条件的元素组成新的List。下面也举几个例子。

>>>a=[12, 3, 4, 6, 7, 13, 21]
>>>b=['a', 'b', 'x']
>>>newList=[(x, y) for x in a for y in b]
>>>newList
[(12, 'a'), (12, 'b'), (12, 'x'), (3, 'a'), (3, 'b'), (3, 'x'), (4, 'a'), (4, 'b'), (4, 'x'), (6, 'a'), (6, 'b'), (6, 'x'), (7, 'a'), (7, 'b'), (7, 'x'), (13, 'a'), (13, 'b'), (13, 'x'), (21, 'a'), (21, 'b'), (21, 'x')]
>>>newList2=[(x, y) for x in a for y in b if x%2==0 and y<'x']
>>>newList2
[(12, 'a'), (12, 'b'), (4, 'a'), (4, 'b'), (6, 'a'), (6, 'b')]

嵌套的for...[if]...语句与多重for语句相当,最前面的for语句是最外层的循环。

善用python的else子句
在日常coding中,分支语句的使用非常普遍,经常会根据是否满足一定的条件对代码执行的逻辑进行一些控制,所以大家对if[elif[else]]一定不会陌生。分支语句中的else子句在其它的条件不满足的时候会被执行到,适当的使用分支语句能够让我们的代码逻辑更加的丰富。
在分支语句中使用else子句在一些常见的编程语言中的用法基本相同,类似于提供了一条默认的执行路径,配合if等条件判断语句使用,相比其它的编程语言(c#, java, js等)在python中,else有一些特殊的用法,配合for, while等循环语句使用,甚至还能配合异常处理try except语句进行使用,能够让我们的代码更加的简洁。

1.配合for/while循环语句使用
在for循环语句的后面紧接着else子句,在循环正常结束的时候(非return或者break等提前退出的情况下),else子句的逻辑就会被执行到。先来看一个例子:

def print_prime(n):
  for i in xrange(2, n):
    # found = True
    for j in xrange(2, i):
      if i % j == 0:
         # found = False 
        break
    else:
      print "{} it's a prime number".format(i)
    # if found:
         # print "{} it's a prime number".format(i)
print_prime(7)

结果:

2 it's a prime number
3 it's a prime number
5 it's a prime number

一个简单打印素数的例子,判断某个数字是否是素数的时候需要遍历比它自己小的整数,任何一个满足整除的情况则判断结束,否则打印这是一个素数的info,有了else的加持,整个例子的逻辑相当的“self-expressive”,如同伪代码一般的好理解而且相比在判断整除的时候设置标志值然后在函数的结尾处判断标志值决定是否打印数字时素数的消息,代码更简洁没有那么多要描述如何做的“过程式”准备工作。
ps: 大家可以把例子中的被注释代码运行对比下效果。

2.配合 try except错误控制使用
在异常处理语句中,else有相似的用法,当try代码块没有抛出任何的异常时,else语句块会被执行到。

def my_to_int(str_param):
  try:
    print int(str_param)
  except ValueError:
    print 'cannot convert {} to a integer'.format(str_param)
  else:
    print 'convert {} to integer successfully'.format(str_param)
my_to_int("123")
my_to_int("me123")
结果:
123
convert 123 to integer successfully
cannot convert me123 to a integer

如打印日志所示,在转换成功未发生错的的时候,else语句里的逻辑会被执行,当然这个例子可能并没有什么太多的实际的用处,但大致能说明else在错误处理中的用处:简化逻辑,避免使用一些标志值就能够准确把握是否发生错误的情况来做一些实际的操作(比如在保存数据的时候如果发生错误,在else语句块中进行rollback的操作,然后紧接着还能加上finally语句完成一些清理操作。

善用else语句块能够让我们编写出更加简明,更加接近自然语言的语义的代码,当然也会更加的pythonic,细微之处大家可以慢慢体会。

Python 相关文章推荐
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
python opencv之SURF算法示例
Feb 24 Python
python删除本地夹里重复文件的方法
Nov 19 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 20 Python
Python 没有main函数的原因
Jul 10 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
详解Python 最短匹配模式
Jul 29 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 #Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 #Python
Python编程中装饰器的使用示例解析
Jun 20 #Python
12步入门Python中的decorator装饰器使用方法
Jun 20 #Python
深入学习Python中的装饰器使用
Jun 20 #Python
Python中Iterator迭代器的使用杂谈
Jun 20 #Python
实例讲解Python编程中@property装饰器的用法
Jun 20 #Python
You might like
PHP概述.
2006/10/09 PHP
最简单的PHP程序--记数器
2006/10/09 PHP
一个更简单的无限级分类菜单代码
2007/01/16 PHP
php读取数据库信息的几种方法
2008/05/24 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
asp 的 分词实现代码
2007/05/24 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
javascript正则表达式总结
2016/02/29 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
什么是Smart Navigation?
2016/07/03 面试题
室内设计实习自我鉴定
2013/09/25 职场文书
财务会计专业应届毕业生求职信
2013/10/18 职场文书
专科毕业生学习生活的自我评价
2013/10/26 职场文书
迟到检讨书大全
2014/01/25 职场文书
建筑个人求职信范文
2014/01/25 职场文书
安全责任书范文
2014/03/12 职场文书
协议书怎么写
2014/04/21 职场文书
大二学习计划书范文
2014/04/27 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
Java 多线程协作作业之信号同步
2022/05/11 Java/Android