2014-09-11 4 views
-2

если (int4/int3) == (int3/int2) == (int2/int1), я сделаю что-нибудь. Как обрабатывать ошибки деления, если я хочу взять в результатах int4==int3==int2==int1==0 такжеБолее эффективный способ обработки деления на ноль?

try: 
    (int4/int3) == (int3/int2) == (int2/int1) 
except ZeroDivisionError: 
     PerformA() 
else: 
     PerformA() 
+0

как насчет «если int2 = 0 и (int1!/int2) == (int3/int2): "... – Pascal

+6

Не относится к вашему вопросу, но поскольку это Python, ваш отступ имеет значение. Устраните это. – Bucket

+0

@PascalBeyeler. Отредактировал мой вопрос –

ответ

2

Если я правильно понимаю ваш вопрос, вам просто необходимо знать, как лучше обрабатывать это сравнение, когда некоторые из сравнений могут быть недействительными. Образец, который я обычно вижу (и использую), должен проверять условия краев (если они могут быть довольно распространены) и обрабатывать их. Если никаких краевых условий не существует, вы можете перейти к стандартному процессу.

В данном конкретном случае у вас есть один краевой случай: когда один из ваших знаменателей равен нулю. Поэтому проверьте, равен ли любой из int1, int2, или int3, и сделать что-то подходящее, если это так. Если их нет, вы можете продолжить сравнение своих отношений.

if not (int1 and int2 and int3): 
    do_something_with_zero_values() 
elif (int4/int3) == (int3/int2) == (int2/int1): # This is now a safe operation 
    do_something() 

Конечно, вы можете также использовать обработку исключений для борьбы с крайними случаями. Предположительно, вы обычно хотите использовать исключения только в «исключительных» обстоятельствах, поэтому, если нуль действительно является законным значением для этих переменных, я бы рекомендовал не осмысливать его как исключение. См. this question для получения дополнительной информации об этом обсуждении.

+0

Я предпочитаю использовать 'all' для таких вещей:' if not all ([int1, int2, int3]) ', особенно если это длинный список или это уже список. – mtik00

+0

@ mtik00 Конечно, но эти переменные (насколько я могу судить) уже не входят в список, и их всего три. Обычно я сохраняю 'all' (или' any'), когда я делаю что-то более сложное, чем прямая правдивость; например 'if any (math.isnan (n) для n в big_list_of_floats):' –

0

В зависимости от того, что вы на самом деле хотите достичь (0 семантика не ясны), здесь есть два варианта:

if 0 in (int1, int2, int3, int4) or int1/int2 == int2/int3 == int3/int4: 
    foo() 

или

if not any(int1, int2, int3, int4) or int1/int2 == int2/int3 == int3/int4: 
    foo() 
Смежные вопросы