#python #try-except
#python #try-except
Вопрос:
Итак, я пытаюсь установить несколько значений, разделенных другими переменными, которые могут быть равны 0, поэтому я решил использовать try except:
try:
p = pacific / float(a)
m = mountain / float(b)
c = central / float(c)
e = eastern / float(d)
except ZeroDivisionError:
p = 0
m = 0
c = 0
e = 0
print(p)
print(m)
print(c)
print(e)
Итак, поскольку все b c и d могут быть равны нулю, я хотел создать экземпляр, в котором, если p m c или e в конечном итоге не определены в результате того, что b c или d равны нулю, я хочу установить только одну конкретную неопределенную переменную (p m c или e)до 0. Например, если все p m c разделяются на числа с плавающей запятой, но d равно 0, а e становится неопределенным, я хочу вернуть числовые значения p, m и c, но e равно 0. Как мне этого добиться? Мой приведенный выше код устанавливает p m c и e для всех в 0, если только одна переменная среди p m c или e не определена. Я знаю, что, вероятно, мог бы перебрать это и попробовать, за исключением каждой из 4 переменных, но я ищу способ сократить этот фрагмент кода.
Комментарии:
1. Обновите свой пример, чтобы включить значения переменных. Были ли они строками?
2. да, это были строки, но в любом случае они являются числами с плавающей запятой при вычислении
3. Да, я заметил это со
float()
стороны. Странно, что вы не добавляете инициализацию.
Ответ №1:
Вы могли бы написать функцию, чтобы попробовать разделение и вернуть значение по умолчанию.
def mydiv(a, b):
try:
return a/float(b)
except ZeroDivisionError:
return 0
p = mydiv(pacific, float(a))
m = mydiv(mountain, float(b))
c = mydiv(central, float(c))
e = mydiv(eastern, float(d))
Ответ №2:
Вам нужно будет проверять каждую запись, но вы можете сделать это с минимальным кодом
p = pacific / float(a) if float(a)!=0 else 0
m = mountain / float(b) if float(b)!=0 else 0
c = central / float(c) if float(c)!=0 else 0
e = eastern / float(d) if float(d)!=0 else 0
print(p)
print(m)
print(c)
print(e)
Комментарии:
1. Я думаю
a
, что это строка. Я тоже был обманут этим!
Ответ №3:
Возможно, вам лучше использовать массивы numpy, которые обладают хорошими возможностями обработки ошибок и требуют гораздо меньше кода. Деление на ноль приводит к бесконечности, которая легко заменяется нулем.
import numpy as np
pmce = np.array([1,2,3,4]) # numerator
abcd = np.array([5,6,0,8]) # denominator
with np.errstate(divide='ignore'):
pmce_new = pmce/abcd
pmce_new[np.isinf(pmce_new)] = 0
print(pmce_new)
Вывод:
[0.2 0.33333333 0. 0.5 ]