55

我刚开始学习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工作?

4

3 回答 3

91

你调用test(45). 这将测试是否45 > 9为真,因此它调用test(35)(45 - 10),而不返回其结果。同样的事情发生在test(25)and test(15),直到 finallytest(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将返回给你的调用者,无论你是否调用了该分支中的任何其他函数,无论如果你调用某些东西,该函数可能会返回什么,并且无论您调用的函数是否恰好与您所在的函数相同。

于 2012-07-06T08:06:06.830 回答
28

return 是缩进的,所以它只在 else 分支中执行。如果采用第一个分支,则该函数隐式返回 None。

您需要将其更改为

return test(x-10)
于 2012-07-06T05:13:17.553 回答
5

您忘记在x > 9. 没有返回值,函数将“返回” None

于 2012-07-06T05:13:45.320 回答