【问题标题】:stop recursion from 'deepest' reccursion in python 3从python 3中的“最深”递归停止递归
【发布时间】:2014-01-06 04:05:41
【问题描述】:

当用户输入无效输入时,我试图阻止代码中发生错误。这是一个演示我的问题的简化示例。

def foo():
try:
    a = int(input('1,2,3 or 4'))
except (ValueError, UnboundLocalError):
    print ('invalid input')
    print ('')
    print ('Try 1,2,3 or 4')
    foo()
if a == 3:
    print ('done')

当我输入一个整数时,该函数运行完美。当我在a = int(input()) 部分输入一个字符串时,它会再次运行foo()。但是,当我然后输入 3 时,它会打印 done',但会继续提供尽可能多的 ValueError,因为我输入不正确,然后是 UnboundLocalError。我认为这是因为我一遍又一遍地运行该函数在自身内部,因此它必须“出来”。有没有更好的方法来重新运行函数而不使用递归?我是编程新手。

【问题讨论】:

    标签: function recursion python-3.x


    【解决方案1】:

    将最后两行放在try..except 块内。

    def foo():
        try:
            a = int(input('1,2,3 or 4'))
            if a == 3:
                print ('done')
        except (ValueError, UnboundLocalError):
            print ('invalid input')
            print ('')
            print ('Try 1,2,3 or 4')
            foo()
    

    而且你最好使用while循环来避免增加递归深度:

    def foo():
        while True:
            try:
                a = int(input('1,2,3 or 4'))
                if a == 3:
                    print ('done')
                break
            except (ValueError, UnboundLocalError):
                print ('invalid input')
                print ('')
                print ('Try 1,2,3 or 4')
    

    【讨论】:

      【解决方案2】:

      您遇到的问题是,当您在异常处理程序中进行递归时,您没有退出该函数。一种解决方案是递归时return foo(),但这仍然会很尴尬(Python不进行尾调用优化,所以如果你继续输入,这将建立一大堆等待返回的调用无效值)。更好的解决方案是使用循环:

      a=None:
      while a is None:
          try:
              a = int(input('1,2,3 or 4'))
          except ValueError:
              print ('invalid input')
              print ('')
              print ('Try 1,2,3 or 4')
          # you could do more validation here, and set `a` back to `None` if it is invalid
      if a == 3:
          print("done")
      

      while 循环将继续要求输入,直到用户提供可接受的值。不需要递归。

      【讨论】:

        【解决方案3】:

        将 try 和 except 块拉到递归函数之外这样您就不会输入多个不同的尝试。然后当你的递归函数抛出一个错误时,它会一直备份它,任何一个只有你拥有的 try 块。

        【讨论】:

        • 'catch' 的意思是 'except' 吗?你能在代码中发布你的意思吗?谢谢。
        猜你喜欢
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多