Python 中的 else详解

 更新时间:2016年04月23日 16:26:57   投稿:hebedich  
这篇文章主要介绍了Python 中的 else详解的相关资料,需要的朋友可以参考下

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

相关文章

  • Pycharm配置导入torch报错Traceback的问题及解决

    Pycharm配置导入torch报错Traceback的问题及解决

    这篇文章主要介绍了Pycharm配置导入torch报错Traceback的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Python尾递归优化实现代码及原理详解

    Python尾递归优化实现代码及原理详解

    这篇文章主要介绍了Python尾递归优化实现代码及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • pyside+pyqt实现鼠标右键菜单功能

    pyside+pyqt实现鼠标右键菜单功能

    这篇文章主要为大家详细介绍了pyside+pyqt实现鼠标右键菜单功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • python输入多行字符串的方法总结

    python输入多行字符串的方法总结

    在本篇文章里小编给大家分享的是关于python输入多行字符串的方法以及实例代码,需要的朋友们可以学习下。
    2019-07-07
  • 详解python中DRF框架的数据校验方式

    详解python中DRF框架的数据校验方式

    这篇文章主要为大家详细介绍了python中DRF框架的数据校验方式,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-10-10
  • Python2和Python3.6环境解决共存问题

    Python2和Python3.6环境解决共存问题

    这篇文章主要介绍了Python2和Python3.6环境解决共存问题,需要的朋友可以参考下
    2018-11-11
  • Python使用pylab库实现绘制直方图功能示例

    Python使用pylab库实现绘制直方图功能示例

    这篇文章主要介绍了Python使用pylab库实现绘制直方图功能,结合实例形式分析了Python数据读取、遍历以及基于pylab库绘制直方图的相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • 如何用Pythony验证万物归一(考拉咨猜想)

    如何用Pythony验证万物归一(考拉咨猜想)

    考拉咨猜想简单的来说,就是你随便给我一个整数,我最后都是会通过固定的规则演变成"1",万物归一.今天我们就用那Python验证一下这个猜想
    2021-06-06
  • Python设置Word全局样式和文本样式的示例代码

    Python设置Word全局样式和文本样式的示例代码

    这篇文章主要介绍了如何利用Python对Word内容进行各种样式的设置,让其能够看起来更加的美观。文中的示例代码讲解详细,需要的可以参考一下
    2022-05-05
  • python实现灰度图

    python实现灰度图

    这篇文章主要为大家详细介绍了python实现灰度图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论