免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11545 | 回复: 9

各位怎么处理除数为零的情况 [复制链接]

论坛徽章:
0
发表于 2014-10-14 15:09 |显示全部楼层
举个例:
def func(x):
     return 1/x;

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

也可能是这么调用的
x=[0,1,2,3]   (或者 x=numpy.array([0,1,2,3]))。
y = func(x);

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

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

论坛徽章:
1
卯兔
日期:2014-10-14 13:29:48
发表于 2014-10-14 15:33 |显示全部楼层

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

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2014-10-15 10:34 |显示全部楼层
本帖最后由 ssfjhh 于 2014-10-17 22:51 编辑
  1. def func(x):
  2.     return x and 1/x or 1e99
复制代码

论坛徽章:
0
发表于 2014-10-16 21:43 |显示全部楼层
两位的代码还是有些问题,ssfjhh 的方案仍然会发生除零错误,zxjiuniu 的方案在单独使用func(0)时没有问题,但在进行代数迭代时仍然会报除零错误,并停止迭代。
谢谢两位的回答

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2014-10-17 10:23 |显示全部楼层
回复 4# foxwb


    可否给个反例?

论坛徽章:
0
发表于 2014-10-17 17:42 |显示全部楼层
x=0时不就错了吗回复 3# ssfjhh


   

论坛徽章:
0
发表于 2014-10-17 17:46 |显示全部楼层
python鼓励用try,所以最pythonic的解决方案就像2楼的,但我觉得要把try移到函数内
  1. def func(x):
  2.     try:
  3.         return 1 / x
  4.     except ZeroDivisionError:
  5.         return 1e99
复制代码
要么这样
  1. return 1 / x if x != 0 else 1e99
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2014-10-17 22:52 |显示全部楼层
回复 6# zsjbz


    写反了,已经更正。

论坛徽章:
0
发表于 2014-10-23 20:40 |显示全部楼层
本帖最后由 Hadron74 于 2014-10-23 20:44 编辑

回复 4# foxwb

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

  12. @deal_zero
  13. def func(x):
  14.     return 1/x

  15. y=[-1.0,0.,2.]
  16. print func(y)
复制代码
结果:
  1. [-1.0, 1e99, 0.5]
复制代码

论坛徽章:
0
发表于 2014-11-04 21:27 |显示全部楼层
回复 9# Hadron74


    非常感谢,学了很多 ,在次也谢谢所有参与讨论的人
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP