while、for、try except语句中的else

Python中文社区

共 2232字,需浏览 5分钟

 ·

2021-02-24 19:43

Python中的else是基础的语句,它的两种使用形式是:
if condition:
    doSomeThings
else:
    doAnthorThings
以及
if condition1:
    do1
elif condition2:
    do2
else:
    doOtherThings
这两个用法理解起来没有问题。下面要看的是for,while循环和try异常处理语句中的else的用法。

一、for,while循环中的else

for,while循环中,else用于循环正常结束,且循环体中没有break、return和异常抛出,则执行else语句块中的内容。 例如,我们判断列表ls中是否全是奇数。普通情况下,需要引入一个标志变量allOdd,指示所有变量都是奇数,有偶数出现则将此变量设为False。写法如下:
ls = [1, 3, 5, 7, 9]

allOdd = True

for i in ls:
    if i % 2 == 0:
        allOdd = False
        break

if allOdd:
    print('list ls %r constructed by only odd number' % ls)
else:
    print('list ls %r ** is\'t ** constructed by only odd number' % ls)
利用else指示循环正常结束的功能,采用for循环或者while循环加else的写法如下:
for i in ls:
    if i %2 == 0:
        print('list ls %r ** is\'t ** constructed by only odd number' % ls)
        break
else:
    print('
list ls %r constructed by only odd number' % ls)
可见,for循环使用else语句之后,节省了指示性变量allOdd,以及相应的处理语句。整个程序语义上更简洁、逻辑上更顺畅。

二、try异常处理语句中的else

try except异常捕获处理语句中,else定义用于没有异常出现时执行的部分。 例如,当我们处理有可能导致异常的计算时,else语句定义的部分,可以确保没有异常发生,得到了正确计算结果。例子是计算简单的除法。普通写法:
try:
    result = a/b
    print(result)
except TypeError:
    print('输入数字')
except ZeroDivisionError:
    print('被除数不能为零')
采用else语句时的写法:
try:
    result = a/b
except TypeError:
    print('输入数字')
except ZeroDivisionError:
    print('被除数不能为零')
else
    print('计算结果%r'%result)
也就是说,try except else finally分别对应如下关系:
  • try       可能抛出异常的语句。
  • except    捕获异常,处理异常。
  • else      无异常,明确得知try语句中无异常。而不是这两种情况:有异常;有异常但处理了。
  • finally   有或无异常,都执行的语句,一般为关闭、清理工作。
else语句在try except句法中最主要的功能,是明确指出了没有异常出现时才执行的语句块。与出现异常,或者出现异常并且处理了这两种情况是分开的。这个语法块是在没有异常出现时执行的,保证了环境的正确性。

三、简单总结

  • for while循环中,else用于循环正常结束,且循环体中没有break、return或异常抛出,则执行else语句块中的内容。

  • try except异常捕获处理语句中,else是定义用于没有异常出现时执行的部分。

  • 不同于if else 语句,以上两种else用法看起来有些复杂。简单理解,可以把else语句块当做语句主体中“没有幺蛾子“时执行的语句块。这样就可以简单理解了else的两种用法了。

  • 许多人反对在此处复用else关键字来表达除外情况,认为then关键字或许更好(luciano ramalho《fluent python》),更甚者主张遵循“最小惊讶原则”,即在for和while语境里不要用else关键字,以免它给人带来疑惑(Brett Slatkin《Effective Python》)。笔者认为,如果把两处else统一理解为“没有出现问题,没有幺蛾子”,那么此时的else语法会变成一个很有用的技巧。

作者:巩庆奎,大奎,对计算机、电子信息工程感兴趣。gongqingkui at 126.com

赞 赏 作 者



更多阅读



2020 年最佳流行 Python 库 Top 10


2020 Python中文社区热门文章 Top 10


5分钟快速掌握 Python 定时任务框架

特别推荐




点击下方阅读原文加入社区会员

浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报