我们都知道 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 的应用场景!

zerodivisionerror什么意思python-Python 中的 else详解相关推荐

  1. 站长在线Python教程精讲:在Python函数中的局部变量详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的局部变量详解>.本文的主要内容有:变量的作用域的概念.局部变量的概念.局部变量的举例. 目录 1.变量 ...

  2. 同步锁 php,python线程中同步锁详解

    这篇文章主要为大家详细介绍了python线程中同步锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十 ...

  3. Python开发中的接口详解和使用方法

    在服务器环境实际开发过程中,往往要通过写接口来请求或者发送数据,那么到底什么是接口,如何通过调用接口发送或者请求数据呢? 一.接口的定义 简单来说,域名(地址)带上参数就是一个接口,然后通过调用此接口 ...

  4. python enumerate_Python中enumerate用法详解

    enumerate()是python的内置函数.适用于python2.x和python3.x enumerate在字典上是枚举.列举的意思 enumerate参数为可遍历/可迭代的对象(如列表.字符串 ...

  5. python deque_python中deque类详解

    最近在pythonTip做题的时候,遇到了deque类,以前对其不太了解,现在特此总结一下 deque类是python标准库collections模块中的一项,它提供了两端都可以操作的序列,这意味着, ...

  6. Python时间序列中ADF检验详解

    转自:https://pengfoo.com/post/machine-learning/2017-01-24 Abstract 在ARMA/ARIMA这样的自回归模型中,模型对时间序列数据的平稳是有 ...

  7. python字符串中占位符详解

    一.使用 % 的形式 常用占位符: 1.%d 整数占位符 >>> '%d 木头人'%123 '123 木头人' 2.%f 浮点数占位符 >>> '你有%f米高吗?' ...

  8. python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...

  9. python 中range(10)什么意思_range什么意思python编程【面试题详解】

    今天爱分享给大家带来range什么意思python编程[面试题详解],希望能够帮助到大家. 今天来谈一谈关于Python中range()的作用,和我个人的理解. range的中文意思是,范围.幅度.或 ...

  10. 【 Python 中 int 用法详解】(转载)

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

最新文章

  1. 如何轻松应对DNS劫持
  2. Django 进阶杂记
  3. Mysql主主复制高可用解决方案
  4. python中两个矩阵之间的点乘_Python基础--数据分析库--Numpy
  5. STL源码剖析学习七:stack和queue
  6. 【C 语言】C 字符串 ( 表示方法 | strcpy | strcat | strlen | strcmp )
  7. 栅格数据的像素值保存问题
  8. android 删除文件
  9. 【内网安全】域横向smbwmi明文或hash传递
  10. jms spring_JMS和Spring:有时很重要的小事情
  11. C++语法:vector的使用
  12. 怎么在HTML上显示数据库的表格,在预定义的html表格中显示数据库表格记录
  13. 一些科研中经常用到的工具
  14. ansible+ssh自动化运维
  15. Default process group has not been initialized, please make sure to call init_process_group
  16. 计算机未来职业人生规划目标与行动措施,计算机职业规划书1500字
  17. 联想笔记本prtsc不能截图_笔记本上Fn+PrtSc 组合键无法调出截屏工具 Fn和Ctrl功能怎么交换...
  18. java实现url编码与中文的互相转换
  19. 12306查询车票信息返回的数据解析
  20. C#把月日年帶有 AM、PM的时间格式转换为正常时间格式

热门文章

  1. 如何使用sed在文件中确定行插入带有变量的字符串
  2. Java Script 之 Promise
  3. java中子类对父类中的私有变量和私有方法有拥有权无使用权
  4. python PIL/Pillow图像扩展、复制、粘贴处理
  5. Python高级特性: 函数编程 lambda, filter,map,reduce
  6. 8086 汇编指令手册查询(转)
  7. Spinner弹出框遮挡住显示框的解决办法
  8. Android系统移植与驱动开发--第四章
  9. html5、canvas绘制本地时钟
  10. 删除DriverStore\FileRepository文件夹后,设备驱动无法安装,提示“没有为设备信息集或元素选择驱动程序(代码 28)”的解决办法...