我一直在编写一些python代码,处理列表以创建一个矩阵,并且一直在研究一种填充元素和那些元素周围的值的方法。我遇到了“索引超出范围的错误”,就好像我循环遍历每个元素并到达矩阵的远端,然后尝试进一步添加,它就会从列表中掉出来。尽管这是一种糟糕的做法,但我还是决定使用"try...except..pass“方法,使我的代码看起来像这样:https://i.stack.imgur.com/fMYCF.png
然而,问题是,一旦它传递了一个错误,它就会直接返回到循环的开头,并且无法将剩余的值添加到周围的元素中。有没有办法让"try“命令单独应用于每个命令,或者必须单独应用于每一行?
发布于 2018-05-31 09:17:20
在这种情况下,您通常需要的是一个包装器函数。
例如,您有一堆如下所示的代码行:
self.w[i0-1][j0+1] += 3
每行到下一行的唯一区别是两个索引和增量值。因此,让我们编写一个将这三件事作为参数的方法:
def _inc(self, i, j, diff):
try:
self.w[i][j] += diff
except:
pass
现在,其中的每一行都可以更改为:
self._inc(i0-1, j0+1, 3)
…它会做你想做的:递增所有不会引发异常的东西,当它引发异常时什么也不做。
但是,既然我们这样做了,您可能不希望这里有一个空的except
。相反,您只想防范您所期望的特定异常。很可能是一个IndexError
。
包装器函数的好处是我们只需要在一个地方而不是78个地方改变东西:
def _inc(self, i, j, diff):
try:
self.w[i][j] += diff
except IndexError:
pass
同样的,如果你想改变一些东西,让它在每次有异常的时候调用log.debug
,你只需要替换那个pass
。
或者,如果您想要预先检查或后检查该0 <= i < len(self.w) and 0 <= j < len(self.w[i])
。(您可能希望这样-请注意,如果self.w
是列表列表,当i0
为0时,i0-1
为-1
,这不会引发IndexError
,它将递增最后一行的…)
https://stackoverflow.com/questions/50615293
复制相似问题