下面是有趣的代码:
def func1():
try:
return 1
finally:
return 2
def func2():
try:
raise ValueError()
except:
return 1
finally:
return 3
func1()
func2()
请有人解释一下,这两个函数会返回什么结果以及为什么,即描述执行顺序
下面是有趣的代码:
def func1():
try:
return 1
finally:
return 2
def func2():
try:
raise ValueError()
except:
return 1
finally:
return 3
func1()
func2()
请有人解释一下,这两个函数会返回什么结果以及为什么,即描述执行顺序
finally
块中没有放置return
语句,那么在try
块中的任何 return
语句中的值实际上都会被返回(而不会被像None
这样的值覆盖) 。 - scharfmn它总是会进入finally
块,因此会忽略try
和except
中的return
。如果在try
和except
之前有一个return
,它将返回该值。
def func1():
try:
return 1 # ignoring the return
finally:
return 2 # returns this return
def func2():
try:
raise ValueError()
except:
# is going to this exception block, but ignores the return because it needs to go to the finally
return 1
finally:
return 3
def func3():
return 0 # finds a return here, before the try except and finally block, so it will use this return
try:
raise ValueError()
except:
return 1
finally:
return 3
func1() # returns 2
func2() # returns 3
func3() # returns 0
在之前放置print
语句真的,真的很有帮助:
def func1():
try:
print 'try statement in func1. after this return 1'
return 1
finally:
print 'after the try statement in func1, return 2'
return 2
def func2():
try:
print 'raise a value error'
raise ValueError()
except:
print 'an error has been raised! return 1!'
return 1
finally:
print 'okay after all that let\'s return 3'
return 3
print func1()
print func2()
这将返回:
try statement in func1. after this return 1
after the try statement in func1, return 2
2
raise a value error
an error has been raised! return 1!
okay after all that let's return 3
3
你会注意到,Python 总是返回最后一个被返回的东西,而不管代码中是否"达到"return 1
。无论何时,finally
块都会被运行,因此函数中最后要返回的东西就是在 finally 块中返回的内容。在 func1
中,这是2。在 func2
中,这是3。
return
相同的效果?我尝试了break
但 Python 说break
不在循环内。 - Zack Light