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

qcuzuvrc  于 2021-07-14  发布在  Java
关注(0)|答案(4)|浏览(418)

我有一个函数调用它自己:

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 从何而来,如何修复我的功能?

mcvgt66p

mcvgt66p1#

它回来了 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()
v64noz0r

v64noz0r2#

要返回非none的值,需要使用return语句。
在您的例子中,if块只在执行一个分支时执行一个return。将返回移到if/else块之外,或者在两个选项中都有返回。

gjmwrych

gjmwrych3#

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

vbkedwbf4#

我觉得这个代码更清楚

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

相关问题