【问题标题】:Why does my recursive function return None?为什么我的递归函数返回无?
【发布时间】:2013-07-22 00:29:02
【问题描述】:

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

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 不一定。现在你在堆上分配一个元组只是为了做一个简单的比较。在关键路径上可能会很痛苦,而且它的可读性并不高,真的。

标签: python function recursion return


【解决方案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

因此,您需要在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 ,堆栈将只收集“无”值。
  • 您,先生,真是个天才!这对我来说并不直观。
【解决方案2】:

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

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

【讨论】:

  • 我尝试将其移出区块,但无济于事。它不是返回正确的值,而是返回第一个不正确的值。另外,我不想要 if/else 语句的 if 部分的 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】:

    我觉得这段代码更清楚

    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 在我发表评论后代码已更改,因此不再相关。我想我应该删除它
    猜你喜欢
    • 2021-11-13
    相关资源
    最近更新 更多