我有这个调用自己的函数:
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
来自哪里,我该如何修复我的功能?
它正在返回
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()
要返回 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()