我们都知道 Python 中else的基本用法是在条件控制语句中的 if...elif...else...,但是 else 还有两个其它的用途,一是用于循环的结尾,另一个是用在错误处理的 try 中。这原本是 Python 的标准语法,但由于和大部分其它编程语言的习惯不太一样,致使人们有意或无意地忽略了这些用法。另外,对于这些用法是否符合 0×00 The Zen of Python 的原则以及该不该广泛使用也存在很多争议。例如在我看到的两本书里(Effective Python VS Write Idiomatic Python),两位作者就分别对其持有截然不同的态度。

循环中的 else

跟在循环后面的 else 语句只有在当循环内没出现 break,也就是正常循环完成时才会执行。首先我们来看一个插入排序法的例子: from random import randrange

def insertion_sort(seq):

if len(seq) 1:

return seq

_sorted = seq[:1]

for i in seq[1:]:

inserted = False

for j in range(len(_sorted)):

if i _sorted[j]:

_sorted = [*_sorted[:j], i, *_sorted[j:]]

inserted = True

break

if not inserted:

_sorted.append(i)

return _sorted

print(insertion_sort([randrange(1, 100) for i in range(10)]))

[8, 12, 12, 34, 38, 68, 72, 78, 84, 90]

在这个例子中,对已排序的 _sorted 元素逐个与 i 进行比较,若 i 比已排序的所有元素都大,则只能排在已排序列表的最后。这时我们就需要一个额外的状态变量 inserted 来标记完成遍历循环还是中途被 break,在这种情况下,我们可以用 else 来取代这一状态变量: def insertion_sort(seq):

if len(seq) 1:

return seq

_sorted = seq[:1]

for i in seq[1:]:

for j in range(len(_sorted)):

if i _sorted[j]:

_sorted = [*_sorted[:j], i, *_sorted[j:]]

break

else:

_sorted.append(i)

return _sorted

print(insertion_sort([randrange(1, 100) for i in range(10)]))

[1, 10, 27, 32, 32, 43, 50, 55, 80, 94]

我认为这是一个非常酷的做法!不过要注意的是,除了 break 可以触发后面的 else 语句,没有循环的时候也会: while False:

print("Will never print!")

else:

print("Loop failed!")

Loop failed!

错误捕捉中的 else

try...except...else...finally 流程控制语法用于捕捉可能出现的异常并进行相应的处理,其中 except 用于捕捉 try 语句中出现的错误;而 else 则用于处理没有出现错误的情况;finally 负责 try 语句的”善后工作“ ,无论如何都会执行。可以通过一个简单的例子来展示: def divide(x, y):

try:

result = x / y

except ZeroDivisionError:

print("division by 0!")

else:

print("result = {}".format(result))

finally:

print("divide finished!")

divide(5,2)

print("*"*20)

divide(5,0)

result = 2.5

divide finished!

********************

division by 0!

divide finished!

当然,也可以用状态变量的做法来替代 else: def divide(x, y):

result = None

try:

result = x / y

except ZeroDivisionError:

print("division by 0!")

if result is not None:

print("result = {}".format(result))

print("divide finished!")

divide(5,2)

print("*"*20)

divide(5,0)

result = 2.5

divide finished!

********************

division by 0!

divide finished!

总结

有人觉得 else 的这些用法违反直觉或者是 implicit 而非 explicit,不值得提倡。但我觉得这种”判决“需要依赖具体的应用场景以及我们对 Python 的理解,并非一定要对新人友好的语法才算是 explicit 的。当然也不推荐在所有地方都使用这个语法,for/while...else 最大的缺点在于 else 是需要与 for/file 对齐的,如果是多层嵌套或者循环体太长的情况,就非常不适合用 else(回忆一下游标卡尺的梗就知道了:P)。只有在一些简短的循环控制语句中,我们通过 else 摆脱一些累赘的状态变量,这才是最 Pythonic 的应用场景!

python中if else用法详解_Python 中的 else详解相关推荐

  1. python中format函数用法简书_Python 中format 的用法

    format是python2.6新增的一个格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能替代字符串类型 2.单个参数可以多次输出,参数顺序 ...

  2. python中with的用法简单来说_Python中with的用法

    第一次遇到with是在文件那一章,with的作用是就是会自动关掉文件管道. with open('path','读写模式') as f: do something 这一部分就等价于 f = open( ...

  3. python中seed的用法什么作用_Python中的seed()方法怎么用

    Python中的seed()方法怎么用?下面是seed()方法的相关介绍: 描述 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数. 语法 以下是 seed() 方法 ...

  4. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  5. python argparse模块详解_python中argparse模块用法实例详解

    本文实例讲述了python中argparse模块用法.分享给大家供大家参考.具体分析如下: 平常在写命令行工具的时候,经常会带参数,所以用python中的argparse来实现. # -*- codi ...

  6. python中with open写csv文件_Python中的CSV文件使用with语句的方式详解

    是否可以直接使用with语句与CSV文件?能够做这样的事情似乎很自然: import csv with csv.reader(open("myfile.csv")) as read ...

  7. python的sort方法是哪种_python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...

  8. python中sys模块是什么意思_python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  9. python中的zip函数详解_python中的 zip函数详解

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...

  10. python之33个关键字详解_Python 中的关键字 with 详解

    在 Python 2.5 中,with关键字被加入.它将常用的 try ... except ... finally ...模式很方便的被复用.看一个最经典的例子: with open('file.t ...

最新文章

  1. 用osgEarth实现Cesium的后处理特效(1)
  2. 基于激光雷达点云的3D目标检测算法—端到端多视图融合
  3. 保研计算机辅助翻译,本科2013级推免生寄语
  4. 【HDU - 6447】YJJ's Salesman(降维dp,树状数组优化dp)
  5. asp.net ftp上传文件到服务器,.net 文件上传到服务器上
  6. SpringMVC开发框架中使用@ResponseBody注解后返回的json字符串中文乱码问题
  7. qt 获取用户缩放_Qt-如何创建随窗口缩放并保持纵横比的图像?
  8. Ruby代码块(Block)
  9. 全网最全MATLAB学习归纳总结(建模学习必备)
  10. SAP物料批次管理配置及操作手册(轉載)
  11. 华为虚拟化usb服务器,华为FusionComputer服务器虚拟化完美解决方案
  12. Google play aso 关键词覆盖指南
  13. 小器件,大作用-光纤环形器在光纤传输中的应用
  14. video标签和source标签
  15. android webview 手机兼容问题
  16. C++学习-Day-19
  17. photoshop去眼袋
  18. Python代码画小鸭穿雨靴--turtle绘图
  19. 高等数学:第五章 定积分(1)概念与性质 中值定理 微积分基本公式
  20. Someone‘s Acting Sus....

热门文章

  1. 【从零开始制作 bt 下载器】一、了解 torrent 文件
  2. vue 样式冲突解决
  3. PID算法通俗理解,平衡车,倒立摆,适合不理解PID算法的人来看!
  4. 怎么样挑选关键才才能让网站优化效果超凡出众
  5. 软件对接API能使用代理ip吗
  6. 英雄体育逆风上市能否突围?
  7. 国际美妆业巨头押注中国
  8. iOS开发:保持程序在后台长时间运行
  9. 前端练手项目4-数字时钟
  10. 台式计算机用电量是多少,电脑一天耗电量是多少(含台式机和笔记本)?