为什么我的递归函数返回 None?
- 2024-11-15 08:36:00
- admin 原创
- 13
问题描述:
我有这个调用自身的函数:
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
从哪里来的,我该如何修复我的函数?
解决方案 1:
它正在返回,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()
解决方案 2:
要返回 None 以外的值,需要使用 return 语句。
在您的例子中,if 块仅在执行一个分支时执行 return。要么将 return 移到 if/else 块之外,要么在两个选项中都使用 return。
解决方案 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())
解决方案 4:
我认为,要更好地了解递归函数中实际发生的情况,您应该尝试调试代码。我推荐一款有趣的可视化代码执行工具,名为Python Turor。
我将在你的递归函数上尝试这个测试用例,并可视化执行过程:
首先输入my_var
asx
然后输入my_var
as a
。
您可以从调试可视化工具中看到何时my_var = a
执行返回语句。
那么递归函数就会返回a
递归函数中这一行代码处的输入值。
此后它将再次执行get_input()
函数,但不会返回任何值,这print('got input:', get_input())
就是的最终值为的原因None
。
如果用递归函数替换get_input()
内部调用,return get_input()
它将返回此测试用例中my_var
的值。a
希望这个使用Python Tutor调试可视化工具的演示有助于阐明递归函数的执行过程。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件