为什么我的递归python函数返回None?

Cat*_*ate 46 python recursion return function

我有这段自称的代码:

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())
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入"a"或"b",一切都很好.输出是:

Type "a" or "b": a
got input: a
Run Code Online (Sandbox Code Playgroud)

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

Type "a" or "b": purple
You didn't type "a" or "b". Try again.
Type "a" or "b": a
got input: None
Run Code Online (Sandbox Code Playgroud)

我不知道为什么get_input()要回来None,因为它应该只返回my_var.print语句显示None正确的值,但函数由于某种原因不返回该值.

roi*_*ppi 68

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

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

..你不归还价值.

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

>>> def f(x):
...     pass
>>> print(f(20))
None
Run Code Online (Sandbox Code Playgroud)

因此,您需要这样做,而不仅仅是在您的声明中调用 .get_input()ifreturn

  • 递归函数使用 return 来将其值放入堆栈中,这样当函数执行递归时,就会从堆栈中一一取出值。如果不使用 return ,堆栈将仅收集“None”值。 (3认同)

小智 7

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

在您的情况下,if块仅在执行一个分支时执行返回.将返回移动到if/else块之外,或者在两个选项中都返回.