Деление на 0 в калькуляторе
Хочу ввести функцию "Если выполняется деление и второе число равно 0, необходимо выводить строку "Деление на 0!".Много вариантов опробовал,можете предложить альтернативу?
first = float(input())
second = float(input())
operation = input("Введите назваание операции или символ")
if operation == "+":
answer = first + second
elif operation == "-":
answer = first - second
elif operation == "/" and second !=0:
if second == 0:
print("Деление на 0!")
break
elif operation == "*":
answer = first * second
elif operation == "mod":
answer = first % second
elif operation == "pow":
answer = first ** second
elif operation == "div":
answer = first // second
print(answer)
Ответы (4 шт):
Ну можно просто отлавливать ошибку и передавать в переменную, которая отвечает за значение, что будет выведено, сообщение типа Деление на 0!
Реализация:
first = float(input('Первое число: '))
second = float(input('Второе число: '))
operation = input("Введите название операции или символ: ")
if operation == "/":
try:
answer = first / second
except ZeroDivisionError:
answer = "Деление на 0!"
print(answer)
Рассмотрим Ваш код:
elif operation == "/" and second != 0:
# С точки зрения архитектуры плохо смешивать логику
# проверки типа операции и её аргументов в одном месте
# second здесь не может быть равен нулю,
# т.к условие выше это отсекло.
if second == 0:
print("Деление на 0!")
break # break вне циклов while/for не используется
Вот простейший рабочий вариант:
elif operation == "/":
if second == 0:
print("Деление на 0!")
else:
answer = first / second
Аналогично делаем для div, mod. Чтобы строку ошибки не дублировать, лучше её вынести в отдельную константу ZERO_DIV_ERROR.
Если пойти дальше в улучшении логики, то можно сделать ещё пару улучшений.
Во-первых, ошибку деления на ноль в Питоне можно обрабатывать проще – операторы деления генерируют исключение вида ZeroDivisionError, которое можно ловить глобально, а не в конкретные операциях.
Во-вторых, здесь не хватает инкапсуляции. Вы хотели использовать break, видимо, подразумевая return, но для него нужно выполнение кода в контексте функции – создадим её. Это полезно ещё и тем, что позволит переиспользовать код. Также, хорошо бы что-то выводить при получении неизвестной операции.
def calculate_inner(first, second, operation):
if operation == "+":
return first + second
if operation == "-":
return first - second
if operation == "/":
return first / second
if operation == "*":
return first * second
if operation == "mod":
return first % second
if operation == "pow":
return first ** second
if operation == "div":
return first // second
return "Неизвестная операция \"%s\"" % operation
def calculate(first, second, operation):
try:
return calculate_inner(first, second, operation)
except ZeroDivisionError:
return "Деление на 0"
first = float(input())
second = float(input())
operation = input("Введите название операции или символ")
print(calculate(first, second, operation))
Помимо этого, можно вынести код операций в отдельные функции/лямбы и положить их в словарик. Это особенно удобно когда код операций большой и нагромождение их всех в одной функции выглядит слишком загруженно. Также это позволит легко создавать несколько имён одним и тем же операциям. Ещё можно использовать модуль operator со встроенными операторами Питона в виде функций. В итоге код получится и лаконичным, и удобным для дальнейших улучшений (например, можно сделать отдельный словарь операций для функций от одного аргумента вроде взятия модуля, тригонометрических функций и что угодно ещё).
import operator as OP
OPERATIONS = {}
OPERATIONS["+"] = lambda a, b: a+b # можно лямбдой
OPERATIONS["+"] = OP.add
OPERATIONS["-"] = OP.sub
OPERATIONS["*"] = OP.mul
OPERATIONS["/"] = OP.truediv
OPERATIONS["mod"] = OP.mod
OPERATIONS["%"] = OP.mod
OPERATIONS["pow"] = OP.pow
OPERATIONS["**"] = OP.pow
OPERATIONS["div"] = OP.floordiv
OPERATIONS["//"] = OP.floordiv
def calculate(first, second, operation):
try:
return OPERATIONS[operation](first, second)
except ZeroDivisionError:
return "Деление на 0"
except KeyError:
return "Неизвестная операция \"%s\"" % operation
Возможно будет проще через обработку исключений с использованием конструкции try…except.
Для этого надо поместить код (в котором как вы предполагаете может быть деление на 0) между операторами try и except (см. пример ниже).
В начале будет выполняться код, размещенный между данными операторами. В случае если в ходе выполнения этого кода будет ошибка ZeroDivisionError: (деление на 0), то будет выполняться код из блока except