作者:麦叔
来源:麦叔编程
一直以来,我的理解是:
❝
return语句是函数的终结,一旦遇到return,函数马上就结束返回了。
❞
直到认真学习了try...except...finally异常处理才发现并不总是这样的。但这个问题你真的理解吗?
❝
return语句和finally语句到底谁先执行呢?
❞
可能没有你想象的那么简单!
finally语句
来看这段代码例子:
defplay_numer():number_list = []whileTrue:
print(-----------------)try:
number = input(输入一个数字:)
print(int(number)/2)ifnumber ==886:returnexceptExceptionase:
print(f出错了:{e})finally:
number_list.append(number)
print(number_list)
play_numer()
执行结果如下:
-----------------输入一个数字:123
61.5[123]-----------------输入一个数字:321
160.5[123,321]-----------------输入一个数字:886
443.0[123,321,886]
从结果可以看出,就算遇到了886,也在退出之前成功打印了包含886的列表。这似乎说明:
❝
finally语句先执行,然后再执行return语句。
❞
推翻认知的例子
我们现在修改一下代码,会推翻之前的理解:
defplay_numer():number_list = []whileTrue:
print(-----------------)try:
number = input(输入一个数字:)
print(int(number)/2)ifnumber ==886:returnnumber_list.append(return)exceptExceptionase:
print(f出错了:{e})finally:
number_list.append(number)
print(number_list)
play_numer()
代码几乎和前面一样,唯一的区别是在return语句中执行了这个操作:number_list.append(return)。
看看打印结果:
-----------------输入一个数字:123
61.5[123]-----------------输入一个数字:321
160.5[123,321]-----------------输入一个数字:886
443.0[123,321,return,886]
完全一样的输入,看看最后一条打印结果:字符串return在886之前被加入到了列表,这似乎又说明:
❝
return语句在finally之前执行,和前面的结论相反。
❞
结论
这个问题的关键在于认识到:
❝
return语句包含两部分,一部分return关键字后的表达式,比如number_list.append(return),另一部分是return本身,也就是退出函数的操作。
❞
所以正确的顺序是:
❝
return表达式,finally语句块,return操作
❞