一、引言
《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 语句就不执行了。
是不是跟预想的有些出入?
三、总结
通过我们上述的实验,我们再回到引言里面的那段代码,其意义也就一目了然了:
- 当 seq 中的元素全部都是升序排序好了的,那么 for 循环里面的 break 语句是执行不到的,按照我们上述实验中的第 2 点结论来看,我们会默认执行 else 中的 return 语句,正好契合了已经排好序的 seq 不进行处理的设计理念(这里大赞一个)
- 当 seq 中的元素有未按照升序排序好的地方,必然会执行到 break 语句,此时其后的 else 语句就不会执行了,正好去执行后面的排序代码逻辑
综上所述,这段乍看非常迷惑人的代码,竟然蕴含了如此巧妙的设计: )
@墨雨出品 必属精品 如有雷同 纯属巧合
`非学无以广才,非志无以成学!`
网友评论