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


70

我有一个自称的函数:

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


11
return Dat_Function()递归调用时需要做。
古斯塔夫·拉尔森

6
只是一个提示:这种情况的惯用方式my_var != "a" and my_var != "b"my_var not in ('a', 'b')
gonz

Answers:


106

之所以返回,是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()你的if说法,你需要return它:

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

如果递归调用它,是否不应该再次运行if语句?我不明白为什么它不会返回值。
Cate

1
不。看到我的编辑。递归发生,然后您丢弃递归返回的内容。
roippi

因此,如果您从同一个函数内部调用一个函数,则返回值将被丢弃,但是在该函数中返回同一个函数,您实际上只是在调用它main()
凯特

1
您迷失了我main()……您可能会失败很多次,“成功”将返回my_var,这将return通过所有递归调用一直传递到原本。呼叫者。是的main()
roippi

我当时在想,当您return Dat_Function()真的要Dat_Function()再次致电时main()Dat_Function()现在返回一个函数并main()开始调用它。
Cate

10

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

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


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

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

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

此函数将永远不会返回值。在任何用户输入之后,它将自行调用,直到解释器达到递归限制为止。
谢尔盖·舒宾
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.