提问人:Cate 提问时间:7/22/2013 最后编辑:GeorgyCate 更新时间:4/29/2023 访问量:131149
为什么我的递归函数返回 None?
Why does my recursive function return None?
问:
我有这个函数来调用自己:
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()
if
return
if my_var != "a" and my_var != "b":
print('You didn\'t type "a" or "b". Try again.')
return get_input()
评论
main()
my_var
return
main()
若要返回 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())
我认为要更多地了解递归函数中的实际情况,您应该尝试调试代码。我推荐一个有趣的可视化代码执行工具,称为 Python Turor。
我将在您的递归函数上尝试此测试用例,并可视化执行过程:
首先输入 as,然后输入 as 。my_var
x
my_var
a
您可以从调试可视化工具中看到它何时执行 return 语句。my_var = a
然后递归函数将返回递归函数中这一行代码处的输入值。a
之后,它将再次执行函数,它不会返回任何值,这就是最终值为 .get_input()
print('got input:', get_input())
None
如果递归函数中的替换调用 It 将返回此测试用例中的值。get_input()
return get_input()
my_var
a
希望这个使用 Python Tutor 调试可视化工具的演示有助于阐明递归函数的执行过程。
评论
return Dat_Function()
my_var != "a" and my_var != "b"
my_var not in ('a', 'b')
while
return
从循环中取回多个值?我可以把它们放在一个列表中吗?return