web-dev-qa-db-ja.com

ゼロによる除算をゼロに等しくする

ZeroDivisionErrorを無視してn / 0 == 0

26
octosquidopus

分割する前に、分母がゼロかどうかを確認します。これにより、例外をキャッチするオーバーヘッドが回避されます。これにより、ゼロで多くの除算を行う場合に効率が向上する場合があります。

def weird_division(n, d):
    return n / d if d else 0
48
davidism

これにはtry/exceptブロックを使用できます。

def foo(x,y):
    try:
        return x/y
    except ZeroDivisionError:
        return 0

>>> foo(5,0)
0

>>> foo(6,2)
3.0
22
CoryKramer

私はtryexcept(サイバーの答えのように)が通常最良の方法だと思います(そして、よりPythonic:許可を求めるよりも許しを求める方が良い!)が、もう1つあります:

def safe_div(x,y):
    if y == 0:
        return 0
    return x / y

ただし、この方法を好む1つの引数は、ZeroDivisionErrorsが頻繁に発生することが予想される場合、事前に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

したがって、tryexceptを使用すると、多くの(実際にはすべての)エラーに対して3〜4倍遅くなります。つまり、3〜4倍遅くなります。エラーが検出される反復の場合ifステートメントを使用したバージョンは、エラーがほとんどない(または実際にはない)場合、わずかに遅くなります(10%程度)。

13
Rick Teachey
def foo(x, y):
    return 0 if y == 0 else x / y
6
twasbrillig

Zer0DivErrrに直面したくない場合は、try-except式を使用して、Zer0DivErrrを待つ必要はありません。より簡単な方法は、分母がゼロになったときに単純に除算を行わないようにすることで、コードを飛び越えることです。

(if Y Z=X/Y else Z=0)
1
Vynylyn

以下を使用できます。

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で除算します。

0
Saurav Panda