Деление на 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 шт):

Автор решения: franmag

Ну можно просто отлавливать ошибку и передавать в переменную, которая отвечает за значение, что будет выведено, сообщение типа Деление на 0!

Реализация:

first = float(input('Первое число: '))
second = float(input('Второе число: '))
operation = input("Введите название операции или символ: ")

if operation == "/":
  try:
    answer = first / second
  except ZeroDivisionError:
    answer = "Деление на 0!"

print(answer)
→ Ссылка
Автор решения: AivanF.

Рассмотрим Ваш код:

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.

→ Ссылка
Автор решения: AivanF.

Если пойти дальше в улучшении логики, то можно сделать ещё пару улучшений.

Во-первых, ошибку деления на ноль в Питоне можно обрабатывать проще – операторы деления генерируют исключение вида 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

→ Ссылка