我刚刚开始学习python(v3.2.3)并且遇到了关于此函数中return
的奇怪问题:
def test(x):
if x > 9 :
test(x - 10)
else:
print('real value',x)
return x
x = int(input())
y = test(x)
print('this should be real value',y)
当我运行它时,我得到:
45
real value 5
this should be real value None
但我期待:
45
real value 5
this should be real value 5
我尝试在return x
之外添加if
,我获得了默认输入值。任何人都可以解释return
的工作原理吗?
答案 0 :(得分:54)
您调用test(45)
。这将测试45 > 9
是否为真,因此它会调用test(35)
(45 - 10),而不返回其结果。 test(25)
和test(15)
也会发生同样的事情,直到最后调用test(5)
。
这将打印'实际值5',然后返回5.但是返回函数总是的结果会将其返回给此函数的直接调用者。它不会立即跳过几个电话;毕竟,调用者可能希望在返回它的调用者之前对返回的结果执行某些操作。但在这种情况下,只有test(5)
会返回任何内容;所有其他人调用test(x - 10)
,等待返回,忽略它返回的任何内容,然后(隐式)返回None
。由于最外面的调用test(45)
是其中一种情况,因此您获得的是None
。
这是尝试对可能发生的事情进行可视化:
test(45):
| test(35):
| | test(25):
| | | test(15):
| | | | test(5):
| | | | | print('real value',5)
| | | | | return 5 to test(15)
| | | | return None to test(25)
| | | return None to test(35)
| | return None to test(45)
| return None
你没有在解释器中调用test(5)
,从另一个函数调用中调用test(5)
。因此从test(5)
返回该函数调用。事实上,这是一个调用自身的函数完全不相关。如果您的代码如下所示,您将获得完全相同的结果:
def test45(x):
if x > 9 :
test35(x - 10)
else:
print('real value',x)
return x
def test35(x):
if x > 9 :
test25(x - 10)
else:
print('real value',x)
return x
def test25(x):
if x > 9 :
test15(x - 10)
else:
print('real value',x)
return x
def test15(x):
if x > 9 :
test5(x - 10)
else:
print('real value',x)
return x
def test5(x):
if x > 9 :
print 'No more tests :('
else:
print('real value',x)
return x
使用'x = 45'调用的test(x)函数与调用test45(45)
相同。我希望你能明白为什么当递归不是时,应该返回None
。好吧,当涉及递归时,没有任何变化。 return
语句既不知道也不关心它是否从递归调用的函数返回,它在两种情况下的行为完全相同。
事实上,递归并不是什么“特别”的东西;它的行为与普通函数调用完全相同。您从通过参数调用您的事物中接收信息,并通过返回将信息返回给调用您的事物。如果你没有返回某些东西(可能只在if
的一个臂中),那么None
将被返回给你的调用者,无论你是否调用该分支中的任何其他函数,无论是什么如果你做了某些事情,那么该函数可能会返回,无论你调用的函数是否与你所在的函数相同。
答案 1 :(得分:18)
返回是缩进的,因此它只在else分支中执行。如果采用第一个分支,则该函数隐式返回None。
您需要将其更改为
return test(x-10)
答案 2 :(得分:4)
您忘记在x > 9
时返回值。没有返回值,函数将"返回" None
。