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告诉你木马程序的键盘记录原理
Feb 02 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
python实现智能语音天气预报
Dec 02 Python
用python拟合等角螺线的实现示例
Dec 27 Python
适合Python初学者的一些编程技巧
Feb 12 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 Python
Python urllib3软件包的使用说明
Nov 18 Python
用python开发一款操作MySQL的小工具
May 12 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 Python
Python Pandas常用函数方法总结
Jun 15 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 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数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
js快速排序的实现代码
2013/12/08 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
Python解决鸡兔同笼问题的方法
2014/12/20 Python
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
python自动化生成IOS的图标
2018/11/13 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
业务助理岗位职责
2013/11/18 职场文书
外贸专业求职信
2014/03/09 职场文书
党员自我评价2015
2015/03/03 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL