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

问题描述 投票:0回答:4

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

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
来自哪里,我该如何修复我的功能?

python function recursion return
4个回答
141
投票

它正在返回

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

因此,您需要 get_input() 递归调用返回的内容,而不仅仅是

calling
if
在您的
return
语句中:

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

12
投票

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

在您的例子中,if 块仅在执行一个分支时执行返回。要么将返回移到 if/else 块之外,要么在两个选项中都有返回。


2
投票
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())

0
投票

我觉得这段代码更清楚

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()
© www.soinside.com 2019 - 2024. All rights reserved.