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中的数据存储到系统本地的简单方法
Apr 11 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
python队列通信:rabbitMQ的使用(实例讲解)
Dec 22 Python
Django rest framework基本介绍与代码示例
Jan 26 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
Python pandas用法最全整理
Aug 04 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
python绘制简单直方图(质量分布图)的方法
Apr 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简单系统查询模块代码打包下载
2008/06/07 PHP
过滤掉PHP数组中的重复值的实现代码
2011/07/17 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
js实现tab切换效果
2017/02/16 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
毕业证委托书范文
2014/09/26 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
平遥古城导游词
2015/02/03 职场文书
身份证丢失证明
2015/06/19 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python