如何忽略ZeroDivisionError
并制作n / 0 == 0
?
答案 0 :(得分:32)
在分割之前检查分母是否为零。这样可以避免捕获异常的开销,如果您希望将其除以很多,这可能会更有效。
def weird_division(n, d):
return n / d if d else 0
答案 1 :(得分:17)
您可以使用try
/ except
块。
def foo(x,y):
try:
return x/y
except ZeroDivisionError:
return 0
>>> foo(5,0)
0
>>> foo(6,2)
3.0
答案 2 :(得分:10)
我认为try
except
(正如在网络答案中)通常是最好的方式(更多的是pythonic:更好地请求宽恕而不是请求许可!),但这里&#39另一个:
def safe_div(x,y):
if y == 0:
return 0
return x / y
但是,有一个支持这样做的论据是,如果你期望ZeroDivisionError
经常发生,提前检查0分母会快得多(这是python 3):
import time
def timing(func):
def wrap(f):
time1 = time.time()
ret = func(f)
time2 = time.time()
print('%s function took %0.3f ms' % (f.__name__, int((time2-time1)*1000.0)))
return ret
return wrap
def safe_div(x,y):
if y==0: return 0
return x/y
def try_div(x,y):
try: return x/y
except ZeroDivisionError: return 0
@timing
def test_many_errors(f):
print("Results for lots of caught errors:")
for i in range(1000000):
f(i,0)
@timing
def test_few_errors(f):
print("Results for no caught errors:")
for i in range(1000000):
f(i,1)
test_many_errors(safe_div)
test_many_errors(try_div)
test_few_errors(safe_div)
test_few_errors(try_div)
输出:
Results for lots of caught errors:
safe_div function took 185.000 ms
Results for lots of caught errors:
try_div function took 727.000 ms
Results for no caught errors:
safe_div function took 223.000 ms
Results for no caught errors:
try_div function took 205.000 ms
因此,使用try
except
对于许多(或真正的,所有)错误来说,速度要慢3到4倍;也就是说:对于捕获错误的迭代,的速度要慢3到4倍。当很少(或实际上没有)错误时,使用if
语句的版本会稍慢(10%左右)。
答案 3 :(得分:6)
def foo(x, y):
return 0 if y == 0 else x / y
答案 4 :(得分:1)
当您想要有效地处理 ZeroDivisionError
(被零除)时,您不应该使用异常或条件。
result = b and a / b or 0 # a / b
b != 0
时,我们有 True and a / b or 0
。 True and a / b
等于 a / b
。 a / b or 0
等于 a / b
。b == 0
时,我们有 False and a / b or 0
。 False and a / b
等于 False
。 False or 0
等于 0
。Timer unit: 1e-06 s
Total time: 118.362 s
File: benchmark.py
Function: exception_div at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def exception_div(a, b):
5 100000000 23419098.5 0.2 19.8 try:
6 100000000 40715642.9 0.4 34.4 return a / b
7 100000000 28910860.8 0.3 24.4 except ZeroDivisionError:
8 100000000 25316209.7 0.3 21.4 return 0
Total time: 23.638 s
File: benchmark.py
Function: conditional_div at line 10
Line # Hits Time Per Hit % Time Line Contents
==============================================================
10 @profile
11 def conditional_div(a, b):
12 100000000 23638033.3 0.2 100.0 return a / b if b else 0
Total time: 23.2162 s
File: benchmark.py
Function: logic_div at line 14
Line # Hits Time Per Hit % Time Line Contents
==============================================================
14 @profile
15 def logic_div(a, b):
16 100000000 23216226.0 0.2 100.0 return b and a / b or 0
答案 5 :(得分:0)
我想如果你不想面对Zer0DivErrr,你就不必等待它或者通过使用try-except表达式来完成它。更快的方法是通过在分母变为零时使代码简单地不进行除法来跳过它:
(if Y Z=X/Y else Z=0)
答案 6 :(得分:0)
如果你想把两个整数相除,你可以使用:
if y !=0 :
z = x/y
else:
z = 0
或者你可以使用:
z = ( x / y ) if y != 0 else 0
如果你想划分两个整数列表,你可以使用:
z = [j/k if k else 0 for j, k in zip(x, y)]
这里,x 和 y 是两个整数列表。
答案 7 :(得分:-1)
如果可以将整数包装在新类中,则可以查看运算符重载(https://docs.python.org/2/library/operator.html)。然后检查y是0是否返回0和否则是x / y。
答案 8 :(得分:-1)
您可以使用以下内容:
x=0,y=0
print (y/(x or not x))
输出:
>>>x=0
>>>y=0
>>>print(y/(x or not x))
0.0
>>>x =1000
>>>print(y/(x or not x))
0.000999000999000999
如果x不等于0,则x不会为false,所以此时它除以实际x。