ZeroDivisionError
を無視してn / 0 == 0
?
分割する前に、分母がゼロかどうかを確認します。これにより、例外をキャッチするオーバーヘッドが回避されます。これにより、ゼロで多くの除算を行う場合に効率が向上する場合があります。
def weird_division(n, d):
return n / d if d else 0
これにはtry
/except
ブロックを使用できます。
def foo(x,y):
try:
return x/y
except ZeroDivisionError:
return 0
>>> foo(5,0)
0
>>> foo(6,2)
3.0
私はtry
except
(サイバーの答えのように)が通常最良の方法だと思います(そして、よりPythonic:許可を求めるよりも許しを求める方が良い!)が、もう1つあります:
def safe_div(x,y):
if y == 0:
return 0
return x / y
ただし、この方法を好む1つの引数は、ZeroDivisionError
sが頻繁に発生することが予想される場合、事前に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%程度)。
def foo(x, y):
return 0 if y == 0 else x / y
Zer0DivErrrに直面したくない場合は、try-except式を使用して、Zer0DivErrrを待つ必要はありません。より簡単な方法は、分母がゼロになったときに単純に除算を行わないようにすることで、コードを飛び越えることです。
(if Y Z=X/Y else Z=0)
以下を使用できます。
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に等しくない場合、not xはfalseになるため、その時点で実際のxで除算します。