尝试除递归或while循环外?

时间:2018-10-12 13:44:51

标签: python recursion error-handling while-loop try-except

我正在做一个python课程,他们在while循环中建议使用try和except块,以便在满足条件之前一直要求输入。凭直觉,我觉得只需要在“ except”块中再次调用该函数就更短了:

def exceptiontest():
    try:
        print(int(input("number 1: "))+int(input("number 2:")))
    except:
        print("a mistake happened")
        exceptiontest()

exceptiontest()

在课程的论坛上提问时,我得到的答复是不一样。我现在有点困惑。有人可以为我澄清吗?预先感谢!

3 个答案:

答案 0 :(得分:4)

如果您继续输入错误的输入,则在except中调用该函数最终会引发RecursionError: maximum recursion depth exceeded错误。通常,人类在放弃之前不会输入太多错误数据来击中错误,但是您不必要将函数调用放在堆栈上。

while循环更好,因为它是一个函数调用,等待有效的输入。 IT不会浪费过多的资源。

答案 1 :(得分:1)

while循环,有两个原因

  • 更清楚地阅读:虽然不成功,请重试
  • 递归不是免费的。它使先前的功能堆栈保持打开状态。它可能会耗尽内存(在这种情况下可能不会,但是原则上避免它)

答案 2 :(得分:0)

使用while循环(尚未提及)的另一个原因是,您可以利用Python 3.8附带的assignment expressions

函数add封装了获取两个数字并尝试将它们相加的方法。

def add():
    'try to add two numbers from user input, return None on failure'
    x = input('number 1: ')
    y = input('number 2: ')
    try:
        return float(x) + float(y)
    except TypeError, ValueError:
        return None

只要没有while,下面的result循环就会运行。

while (result := add()) is None:
    print('you made a mistake, make sure to input two numbers!')

# use result