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

Python 为什么我的递归函数返回None?,python,function,recursion,return,Python,Function,Recursion,Return,我有一个调用自身的函数: 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_inpu

我有一个调用自身的函数:

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”,一切正常:

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

键入“a”或“b”:紫色
你没有输入“a”或“b”。再试一次。
类型“a”或“b”:a
获得输入:无

我不知道为什么
get\u input()
返回
None
,因为它应该只返回
my\u var
。这个
None
从何而来?如何修复我的函数?

它返回
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\u input()
,不如
返回它:

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

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


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

我认为这段代码更清楚

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())
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()

递归调用时需要执行
return Dat\u Function()
操作。这里有一个提示:
my\u var!=“a”和我的_var!=“b”
条件将是
我的变量不在('a','b')
@gonz不一定。现在,您正在访问堆,分配一个元组只是为了进行简单的比较。在关键路径中可能会很痛苦,而且它的可读性也不会太高。如果它被递归调用,它不应该再次运行if语句吗?我不明白为什么它不会返回值。不。请参阅我的编辑。递归发生了,然后你放弃了递归返回的内容。你失去了我的
main()
位。。。您可以失败任意次数,“成功”的一个将返回
my_var
,它将通过所有递归调用一直传递到原始调用方(
return
ed)。是的,它是
main()
。使用return for recursive function将其值放入堆栈中,这样当函数执行递归时,堆栈中的值将逐个获取。如果您不使用return,堆栈将只收集“None”值。先生,您是个天才!这对我来说不是直觉。我试着把它移出街区,但没有用。它返回的不是正确的值,而是第一个不正确的值。另外,我不希望if/else语句的if部分使用return语句,因为我希望函数只返回正确的值。@SergeyShubin您认为这段代码与user6348168的代码有什么不同。我觉得两者都是一样的。@jiten在我的评论之后,代码被更改了,因此不再相关。我想我应该删除它