foxwb 发表于 2014-10-14 15:09

各位怎么处理除数为零的情况

举个例:
def func(x):
   return 1/x;

在调用时,可能是这样调用的
x=0;
y = func(x);

也可能是这么调用的
x=   (或者 x=numpy.array())。
y = func(x);

在变量为0时,我希望输出一个极大的值,比如1E99也行,但不能抛出异常,否则在迭代运算时,x=0往往会导致迭代提前结束,但我也不想加入过复杂的条件判断,比如
def func(x):
   if type(x)==....:
       deal()
   elseif:
      return 1E99;
   return 1/x;

各位高手是如何处理这种情况的?

zxjiuniu 发表于 2014-10-14 15:33


y=0
def fun(x):
return 1 / x;
try:
fun(y)
except ZeroDivisionError:
print "1E99"

ssfjhh 发表于 2014-10-15 10:34

本帖最后由 ssfjhh 于 2014-10-17 22:51 编辑

def func(x):
    return x and 1/x or 1e99

foxwb 发表于 2014-10-16 21:43

两位的代码还是有些问题,ssfjhh 的方案仍然会发生除零错误,zxjiuniu 的方案在单独使用func(0)时没有问题,但在进行代数迭代时仍然会报除零错误,并停止迭代。
谢谢两位的回答

ssfjhh 发表于 2014-10-17 10:23

回复 4# foxwb


    可否给个反例?

zsjbz 发表于 2014-10-17 17:42

x=0时不就错了吗回复 3# ssfjhh


   

zsjbz 发表于 2014-10-17 17:46

python鼓励用try,所以最pythonic的解决方案就像2楼的,但我觉得要把try移到函数内def func(x):
    try:
      return 1 / x
    except ZeroDivisionError:
      return 1e99要么这样return 1 / x if x != 0 else 1e99

ssfjhh 发表于 2014-10-17 22:52

回复 6# zsjbz


    写反了,已经更正。

Hadron74 发表于 2014-10-23 20:40

本帖最后由 Hadron74 于 2014-10-23 20:44 编辑

回复 4# foxwb

个人觉得,try/except方式解决方案较好。
1)这个方式的解决效率较高,每次计算时少一次判断,只在除零错误时才做特别处理。
2)如果作者需要在迭代中特殊处理,可以参考下面的写法,写一个通用的wrapper函数,在定义新函数的时候加修饰即可:def deal_zero(f):
    def _call(x):
      result=[]
      for a in x:
            try:
                b=f(a)
            except ZeroDivisionError:
                b=1e99
            result.append(b)
      return result
    return _call

@deal_zero
def func(x):
    return 1/x

y=[-1.0,0.,2.]
print func(y)
结果:[-1.0, 1e99, 0.5]

foxwb 发表于 2014-11-04 21:27

回复 9# Hadron74


    非常感谢,学了很多 ,在次也谢谢所有参与讨论的人
页: [1]
查看完整版本: 各位怎么处理除数为零的情况