作者:麦叔
来源:麦叔编程
一直以来,我的理解是:
return语句是函数的终结,一旦遇到return,函数马上就结束返回了。
直到认真学习了try...except...finally异常处理才发现并不总是这样的。但这个问题你真的理解吗?
return语句和finally语句到底谁先执行呢?
可能没有你想象的那么简单!
finally语句
来看这段代码例子:
def play_numer():
number_list = []
while True:
print('-----------------')
try:
number = input('输入一个数字:')
print(int(number)/2)
if number == '886':
return
except Exception as e:
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语句。
推翻认知的例子
我们现在修改一下代码,会推翻之前的理解:
def play_numer():
number_list = []
while True:
print('-----------------')
try:
number = input('输入一个数字:')
print(int(number)/2)
if number == '886':
return number_list.append('return')
except Exception as e:
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操作