87

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

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

4

4 回答 4

124

它正在返回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()
于 2013-07-22T00:31:19.583 回答
12

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

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

于 2013-07-22T00:32:48.573 回答
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())
于 2016-05-17T23:34:14.800 回答
-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()
于 2020-07-10T13:09:16.230 回答