各位怎么处理除数为零的情况
举个例: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;
各位高手是如何处理这种情况的?
y=0
def fun(x):
return 1 / x;
try:
fun(y)
except ZeroDivisionError:
print "1E99" 本帖最后由 ssfjhh 于 2014-10-17 22:51 编辑
def func(x):
return x and 1/x or 1e99 两位的代码还是有些问题,ssfjhh 的方案仍然会发生除零错误,zxjiuniu 的方案在单独使用func(0)时没有问题,但在进行代数迭代时仍然会报除零错误,并停止迭代。
谢谢两位的回答 回复 4# foxwb
可否给个反例? x=0时不就错了吗回复 3# ssfjhh
python鼓励用try,所以最pythonic的解决方案就像2楼的,但我觉得要把try移到函数内def func(x):
try:
return 1 / x
except ZeroDivisionError:
return 1e99要么这样return 1 / x if x != 0 else 1e99 回复 6# zsjbz
写反了,已经更正。 本帖最后由 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] 回复 9# Hadron74
非常感谢,学了很多 ,在次也谢谢所有参与讨论的人
页:
[1]