我跟踪了一些递归函数的装饰器。我想知道怎么回到try街区。我尝试过while循环,但它对我不起作用,因为我的函数是递归的,有人能告诉我如何处理它吗? 问题是当函数改变时,我想继续执行我的 try块
这是我的装饰师和功能
正确结果:
,- change_t([9, 7, 5], 44)
| ,- change_t([9, 7, 5], 35)
| | ,- change_t([9, 7, 5], 26)
| | | ,- change_t([9, 7, 5], 17)
| | | | ,- change_t([9, 7, 5], 8)
| | | | | ,- change_t([7, 5], 8)
| | | | | | ,- change_t([7, 5], 1)
| | | | | | | ,- change_t([5], 1)
| | | | | | | | ,- change_t([], 1)
| | | | | | ,- change_t([5], 8)
| | | | | | | ,- change_t([5], 3)
| | | | | | | | ,- change_t([], 3)
| | | | | | | ,- change_t([], 8)
| | | | ,- change_t([7, 5], 17)
| | | | | ,- change_t([7, 5], 10)
| | | | | | ,- change_t([7, 5], 3)
| | | | | | | ,- change_t([5], 3)
| | | | | | | | ,- change_t([], 3)
| | | | | | ,- change_t([5], 10)
| | | | | | | ,- change_t([5], 5)
| | | | | | | | ,- change_t([5], 0)
| | | | | | | | `- []
| | | | | | | `- [5]
| | | | | | `- [5, 5]
| | | | | `- [5, 5]
| | | | `- [7, 5, 5]
| | | `- [7, 5, 5]
| | `- [9, 7, 5, 5]
| `- [9, 9, 7, 5, 5]
`- [9, 9, 9, 7, 5, 5]
我得到的是: 在我预料到一个例外之后就停止了
^{pr2}$
当引发异常时,将从引发异常的代码中放弃控制。而是将它交给第一个捕捉异常的catch块,或者交给主解释器循环。在
看看你的代码:
当第三个条件为真时,即
l[0]>a
,当l的长度为1时会发生什么?然后在下一个调用中,即return change_t(l[1:],a)
它将引发一个异常,除了主循环之外,任何人都不会捕捉到该异常:这就是代码失败的原因。您需要将第三个条件包装在try-catch子句中,这取决于您想要实现的目标。在正如我在评论中所说的,您需要重新定义异常,以便原始函数能够实际捕获并继续。您希望在except处理程序中只将缩进减少一个,这样就不会在左侧结束得太远:
然后它就起作用了:
^{pr2}$最后,我会清理一下装修工,让它更简洁明了,你在做什么:
在这里,我简化了整个参数聚合以使用列表理解。我还使用了字符串格式,使格式更加清晰。这样,您还可以组合必须放在列表内容周围的括号(在这两种情况下都是这样做的)。当你在没有真正查看异常的情况下重读异常时,我们不需要从一开始就捕捉它,只需确保我们调整了finally块中的缩进。在
实际上,为什么要检查变量参数或关键字参数?接受这两者:
相关问题 更多 >
编程相关推荐