02-Python中的for-else语句

2019-01-30  本文已影响7人  墨雨love薏雪

一、引言

《Python Algorithms 2nd》这本书在第 18 页有这样一段代码:

def sort_w_check(seq):
    n = len(seq)
    for i in range(n-1):
        if seq[i] > seq[i+1]
            break
    else:
        return
    ...

上述代码,是用来进行排序的,其中排序的内容以... 代替省略了,我们主要观察前面一段代码。
其中 for 循环中依次进行了元素的比较,当发现有前一个元素的值大于了后一个元素的值,就执行 break 退出 for 循环。

问题是,for循环后的else有什么作用?

二、探索

1.试验01

# 单独运行下面代码
else:

发现报错,说明else:是不能单独存在的。

File “”, line 1
else:
^
SyntaxError: invalid syntax

2.试验02

for i in range(3):
    print(i)
else:
    print('lwd love ydd')

运行结果如下:

0
1
2
lwd love ydd

得出结论:

for 循环正常执行结束后,else 语句里面的内容也会正常执行。

3.试验03

for i in range(3):
    if i == 2:
        print("哈哈哈·····")
        break
else:
    print('lwd love ydd')

运行结果如下:

哈哈哈·····

得出结论:

当 for 循环被 break 中断后,其后的 else 语句就不执行了。

是不是跟预想的有些出入?

三、总结

通过我们上述的实验,我们再回到引言里面的那段代码,其意义也就一目了然了:

  1. 当 seq 中的元素全部都是升序排序好了的,那么 for 循环里面的 break 语句是执行不到的,按照我们上述实验中的第 2 点结论来看,我们会默认执行 else 中的 return 语句,正好契合了已经排好序的 seq 不进行处理的设计理念(这里大赞一个)
  1. 当 seq 中的元素有未按照升序排序好的地方,必然会执行到 break 语句,此时其后的 else 语句就不会执行了,正好去执行后面的排序代码逻辑

综上所述,这段乍看非常迷惑人的代码,竟然蕴含了如此巧妙的设计: )

@墨雨出品 必属精品 如有雷同 纯属巧合
`非学无以广才,非志无以成学!`
上一篇 下一篇

猜你喜欢

热点阅读