Python 避免零误差除法的策略
在python中是否有避免ZeroDivisionError的最佳实践?例如,考虑以下函数:Python 避免零误差除法的策略,python,python-3.x,python-3.6,Python,Python 3.x,Python 3.6,在python中是否有避免ZeroDivisionError的最佳实践?例如,考虑以下函数: def division (x,y): return x / y 在此函数中,如果y设置为零,则会引发ZeroDivision错误。一种策略是将除法的分母替换为y+1,因此函数为: def division (x,y): return x / (y+1) 或者,如果分母为零,则另一种策略可以返回nan值: def division (x,y): if y == 0:
def division (x,y):
return x / y
在此函数中,如果y设置为零,则会引发ZeroDivision错误。一种策略是将除法的分母替换为y+1,因此函数为:
def division (x,y):
return x / (y+1)
或者,如果分母为零,则另一种策略可以返回nan值:
def division (x,y):
if y == 0:
return np.nan
else:
return x / y
上述策略的缺点是什么?有没有其他方法可以避免零错误?异常处理也是解决此问题的常用方法,但我更倾向于采用预防策略而不是干预。这遵循相同的条件化策略,但您可以使用以下方法:
def division(x, y):
return x/y if y else 0
加法策略的缺点是,如果y是一个小数字而不是-1,那么结果将非常不正确。只有y非常大时才起作用 返回NaN的缺点是,您需要为调用您的函数的人清楚地记录这一点。np.nan会让打电话的人感到惊讶。例如,当您进行类似division1,0==division2,0这样的比较时,期望得到什么 引发错误是正确的做法,并让调用者按照他们的规则处理。请记住,numpy.true\u divide永远不会返回ZeroDivisionError。而是返回inf i、 e
这通常意味着您的算法没有经过仔细设计。在大多数情况下,仅仅处理+/-0并不能帮助您。几乎所有文献中的算法都是通过在绝对值上加一个ε或对绝对值进行阈值化来处理零除。也可以通过仅对分母重要的值进行处理来避免这种情况。为什么要避免错误?你的第一种方法是完全错误的,你的函数现在做了一些完全不同的事情。你的第二个至少在语义上是等价的。在任何情况下,通常情况下,您会尝试捕获此类错误,或者如果您不希望它们发生,那么您希望错误发生。尽早失败。使用y+1并不能解决任何问题,因为现在当y为-1时,你会遇到完全相同的问题。我认为你需要更具体地描述你想象中发生这种情况的用例。或者nan,在0/0的情况下。对不起,没有必要,谢谢你的更正。
a = [1,2,3]
b = [0,1,2]
np.true_divide(a, b)
RuntimeWarning: divide by zero encountered in true_divide
array([inf, 2. , 1.5])