为啥我的递归函数返回 None?
Posted
技术标签:
【中文标题】为啥我的递归函数返回 None?【英文标题】:Why does my recursive function return None?为什么我的递归函数返回 None? 【发布时间】:2021-11-13 04:48:21 【问题描述】:我有这个调用自己的函数:
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
来自哪里?如何修复我的功能?
【问题讨论】:
递归调用时需要return Dat_Function()
。
提示:my_var != "a" and my_var != "b"
条件的惯用方式是 my_var not in ('a', 'b')
@gonz 不一定。现在你在堆上分配一个元组只是为了做一个简单的比较。在关键路径上可能会很痛苦,而且它的可读性并不高,真的。
【参考方案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()
【讨论】:
@SergeyShubin 您认为此代码与 user6348168 的代码有何不同。我觉得两者都是一样的。 @jiten 在我发表评论后代码已更改,因此不再相关。我想我应该删除它【参考方案2】:它返回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
因此,您需要在if
语句中调用 get_input()
,而需要return
它:
if my_var != "a" and my_var != "b":
print('You didn\'t type "a" or "b". Try again.')
return get_input()
【讨论】:
如果被递归调用,是不是应该再次遍历if语句?我不明白为什么它不会返回值。 不。请参阅我的编辑。递归发生,然后你丢弃递归返回的内容。 你用那个main()
把我弄丢了......你可以失败多次,“成功”的那个会返回my_var
,它会被传递下去(@ 987654331@ed)通过所有递归调用一直到原始调用者。没错,是main()
。
对递归函数使用return,以便将其值放入堆栈中,这样当函数执行递归时,堆栈中的值就会被一一取走。如果您不使用 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】:要返回None以外的值,需要使用return语句。
在您的情况下, if 块仅在执行一个分支时执行 return。要么将 return 移到 if/else 块之外,要么在两个选项中都有 return。
【讨论】:
我尝试将其移出区块,但无济于事。它不是返回正确的值,而是返回第一个不正确的值。另外,我不想要 if/else 语句的 if 部分的 return 语句,因为我希望函数只返回正确的值。以上是关于为啥我的递归函数返回 None?的主要内容,如果未能解决你的问题,请参考以下文章