为啥我的递归函数返回 None?

Posted

技术标签:

【中文标题】为啥我的递归函数返回 None?【英文标题】:Why does my recursive function return None?为什么我的递归函数返回 None? 【发布时间】:2013-07-20 15:28:25 【问题描述】:

我有这个调用自己的函数:

def get_input():
    my_var = input('Enter "a" or "b": ')

    if my_var != "a" and my_var != "b":
        print('You didn\'t type "a" or "b". Try again.')
        get_input()
    else:
        return my_var

print('got input:', get_input())

现在,如果我只输入“a”或“b”,一切正常:

Type "a" or "b": a
got input: a

但是,如果我输入其他内容,然后输入“a”或“b”,我会得到:

Type "a" or "b": purple
You didn't type "a" or "b". Try again.
Type "a" or "b": a
got input: None

我不知道为什么get_input() 会返回None,因为它应该只返回my_var。这个None 来自哪里?如何修复我的功能?

【问题讨论】:

递归调用时需要return Dat_Function() 提示:my_var != "a" and my_var != "b" 条件的惯用方式是 my_var not in ('a', 'b') @gonz 不一定。现在你在堆上分配一个元组只是为了做一个简单的比较。在关键路径上可能会很痛苦,而且它的可读性并不高,真的。 【参考方案1】:

我觉得这段代码更清楚

def get_input():
    my_var = str(input('Enter "a" or "b": '))
    if my_var == "a" or my_var == "b":
        print('got input:', my_var)
        return my_var
    else:
        print('You didn\'t type "a" or "b". Try again.')
        return get_input()
get_input()

【讨论】:

@SergeyShubin 您认为此代码与 user6348168 的代码有何不同。我觉得两者都是一样的。 @jiten 在我发表评论后代码已更改,因此不再相关。我想我应该删除它【参考方案2】:

它返回None,因为当你递归调用它时:

if my_var != "a" and my_var != "b":
    print('You didn\'t type "a" or "b". Try again.')
    get_input()

..你没有返回值。

所以当递归确实发生时,返回值被丢弃,然后你从函数的末尾掉了下来。从函数末尾掉下来意味着python隐式返回None,就像这样:

>>> def f(x):
...     pass
>>> print(f(20))
None

因此,您需要在if 语句中调用 get_input(),而需要return 它:

if my_var != "a" and my_var != "b":
    print('You didn\'t type "a" or "b". Try again.')
    return get_input()

【讨论】:

如果被递归调用,是不是应该再次遍历if语句?我不明白为什么它不会返回值。 不。请参阅我的编辑。递归发生,然后你丢弃递归返回的内容。 你用那个main() 把我弄丢了......你可以失败多次,“成功”的那个会返回my_var,它会被传递下去(@ 987654331@ed)通过所有递归调用一直到原始调用者。没错,是main() 对递归函数使用return,以便将其值放入堆栈中,这样当函数执行递归时,堆栈中的值就会被一一取走。如果您不使用 return ,堆栈将只收集“无”值。 您,先生,真是个天才!这对我来说并不直观。【参考方案3】:
def get_input():
    my_var = input('Enter "a" or "b": ')

    if my_var != "a" and my_var != "b":
        print('You didn\'t type "a" or "b". Try again.')
        return get_input()
    else:
        return my_var

print('got input:', get_input())

【讨论】:

【参考方案4】:

要返回None以外的值,需要使用return语句。

在您的情况下, if 块仅在执行一个分支时执行 return。要么将 return 移到 if/else 块之外,要么在两个选项中都有 return。

【讨论】:

我尝试将它移出区块,但无济于事。它不是返回正确的值,而是返回第一个不正确的值。另外,我不想要 if/else 语句的 if 部分的 return 语句,因为我希望函数只返回正确的值。

以上是关于为啥我的递归函数返回 None?的主要内容,如果未能解决你的问题,请参考以下文章

当我递归调用它时,为啥我的函数返回以前的值而不是新的值?

为啥这个递归函数返回正确的值? [复制]

为啥我们需要在这个递归函数中返回

python基础:递归函数返回值(return)误区

递归幂函数:如果没有初始返回值,为啥会这样?

python第三篇 python基础之函数,递归,内置函数