Python 避免零误差除法的策略

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:

在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:
       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])