【问题标题】:Python: How to quit a recursive function when an error arises interrupting the programPython:当出现错误中断程序时如何退出递归函数
【发布时间】:2021-03-28 13:44:46
【问题描述】:

假设我有一个递归函数,比如

def func(n, lis):
    if n == 1:
        return lis
    else:
        lis = func(n-1, lis[:-1])
        print(n,lis)
        lis.append(n)
        if len(lis) < 5:
            return lis
        else:
            return 'Error'

如果我跑了

print (func(6, [6,5,4,3,2,1]))

我明白了

2 [6]
3 [6, 2]
4 [6, 2, 3]
5 [6, 2, 3, 4]
6 Error
Traceback (most recent call last):
  File "d:/Python/test.py", line 324, in <module>
    print (func(6, [6,5,4,3,2,1]))
  File "d:/Python/test.py", line 314, in func
    lis.append(n)
AttributeError: 'str' object has no attribute 'append'

函数读取func(5, [6,2,3,4,5])的返回值,即'Error',放入func,产生AttributeError。这不是我想要的,因为它会停止程序。我试过了

class AtLeastFive(Exception):
    pass

def func(n, lis):
    if n == 1:
        return lis
    else:
        lis = func(n-1, lis[:-1])
        print(n,lis)
        lis.append(n)
        if len(lis) < 5:
            return lis
        else:
            raise AtLeastFive

但这仍然会中断程序。我需要为一系列列表运行该函数,所以我不想要Exception。我想要的是类似的东西

for lis in lists:
    func(n, lis)

但是当出现异常时它会停止。发生不好的事情时是否可以在不中断循环的情况下退出函数?

【问题讨论】:

    标签: python function recursion exception


    【解决方案1】:

    如果我理解你想要做什么,你的函数 func 最终应该为你传递给它的参数返回 Error。如果是这种情况,那么下面的代码应该可以工作:

    def func(n, lis):
        if n == 1:
            return lis
        else:
            lis = func(n-1, lis[:-1])
            print(n,lis)
            # test to see if return value is `Error` and if so, return it:
            if lis == 'Error':
                return lis
            lis.append(n)
            if len(lis) < 5:
                return lis
            else:
                return 'Error'
    
    print (func(6, [6,5,4,3,2,1]))
    

    打印:

    2 [6]
    3 [6, 2]
    4 [6, 2, 3]
    5 [6, 2, 3, 4]
    6 Error
    Error
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2012-08-14
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2021-02-25
      相关资源
      最近更新 更多