前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >享学课堂谈python中else的用途

享学课堂谈python中else的用途

作者头像
企鹅号小编
发布2018-01-08 11:27:20
6870
发布2018-01-08 11:27:20
举报
文章被收录于专栏:编程编程

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

循环中的 else

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

from random import randrange

def insertion_sort(seq):

iflen(seq)1:

returnseq

_sorted=seq[:1]

foriinseq[1:]:

inserted=False

forjinrange(len(_sorted)):

ifi_sorted[j]:

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

inserted=True

break

ifnotinserted:

_sorted.append(i)

return_sorted

print(insertion_sort([randrange(1,100)foriinrange(10)]))

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

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

def insertion_sort(seq):

iflen(seq)1:

returnseq

_sorted=seq[:1]

foriinseq[1:]:

forjinrange(len(_sorted)):

ifi_sorted[j]:

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

break

else:

_sorted.append(i)

return_sorted

print(insertion_sort([randrange(1,100)foriinrange(10)]))

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

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

whileFalse:

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 ZeroDivisi:

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 by0!

divide finished!

当然,也可以用状态变量的做法来替代 else:

def divide(x,y):

result=None

try:

result=x/y

except ZeroDivisi:

print("division by 0!")

ifresult isnotNone:

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

print("divide finished!")

divide(5,2)

print("*"*20)

divide(5,0)

result=2.5

divide finished!

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

division by0!

divide finished!

本文来自企鹅号 - 育人不予媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 育人不予媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档