Как сделать калькулятор: ввод, операции, деление на ноль и функции

Практикумобновлено 07.10.20269 мин чтенияесть тренажёр

Калькулятор на Python — программа, которая получает два числа и знак операции, выбирает действие через if и elif и выводит ответ. Разберём ввод целых и дробных чисел, все 7 арифметических операций, защиту от деления на ноль, функцию calc и цикл, а в тренажёре решим 7 задач.

Загружаем…

Калькулятор на Python за 5 строк

Простейшая версия — это 5 строк: получить первое число, знак операции и второе число, а затем вывести результат. Пока она умеет только складывать, но уже показывает главный путь данных: ввод, преобразование, вычисление, вывод.

a = int(input("Первое число: "))
op = input("Операция: ")
b = int(input("Второе число: "))
if op == "+":
    print(a + b)

Калькулятор на Python — удобный первый проект, потому что результат легко проверить в уме. Создатель языка Гвидо ван Россум задумывал Python читаемым, и арифметика в нём записывается почти как в тетради: знаки +, -, * и / работают привычно.

Если ввести 2, «+» и 3, программа выведет 5. На любой другой знак она промолчит: для него ещё нет ветки. Дальше будем добавлять операции по одной и каждый раз проверять, что старые продолжают работать. Такой порядок — маленький шаг, запуск, проверка — помогает новичку не теряться в длинном коде. Если программа ругается на ввод, вспомните, как устроены функция input и преобразование типов.

Ввод чисел: int или float

Функция input всегда возвращает строку, поэтому числа нужно преобразовать: int() даёт целое, float() — дробное. Без преобразования «2» + «3» склеится в «23».

Для первого калькулятора хватает целых. Но если пользователь введёт 3.5, функция int() завершит программу с ошибкой ValueError — она не умеет превращать в целое строку с точкой. В документации Python подробно описано, какие строки принимают int и float: пробелы по краям допустимы, а буквы — нет. Функция float() принимает и «3.5», и «7», поэтому универсальный калькулятор пишут на float. Учтите, что дробная часть отделяется точкой: строку «3,5» с запятой Python не поймёт. Подробно о типах и их преобразовании рассказано в статье о типах данных Python.

ЗнакОперацияПримерРезультат
+сложение7 + 29
-вычитание7 - 25
*умножение7 * 214
/деление, результат всегда дробный6 / 23.0
//целая часть от деления7 // 23
%остаток от деления7 % 21
**возведение в степень7 ** 249

Обратите внимание на деление: 6 / 2 даёт 3.0, а не 3. Обычное деление в Python 3 всегда возвращает дробное число, даже если делится нацело, — так описано в официальной документации Python[1]. Целочисленное деление // округляет вниз, поэтому -7 // 2 равно −4, а не −3.

Выбор операции через if и elif

Чтобы калькулятор понимал разные знаки, нужна цепочка условий: if проверяет первый знак, каждый elif — следующий, а else ловит всё, что не подошло.

a = float(input("Первое число: "))
op = input("Операция (+ - * /): ")
b = float(input("Второе число: "))

if op == "+":
    print(a + b)
elif op == "-":
    print(a - b)
elif op == "*":
    print(a * b)
elif op == "/":
    print(a / b)
else:
    print("Неизвестная операция")

Python проверяет условия сверху вниз и выполняет первую подходящую ветку, остальные пропускает. Поэтому писать отдельные if вместо elif можно, но тогда программа зря проверит все условия, а при ошибке в одном из них может сработать сразу две ветки. Ветка else важна: без неё на опечатку вроде «х» вместо «*» пользователь не получит никакого ответа. Подробнее о ветвлениях — в уроке об условиях if, elif и else.

Деление на ноль и неверный ввод

На ноль делить нельзя — ни в математике, ни в Python: выражение 5 / 0 останавливает программу с ошибкой ZeroDivisionError. Хороший калькулятор проверяет делитель заранее.

В документации Python ZeroDivisionError описано как исключение, которое возникает, когда второй операнд деления или остатка равен нулю.

a = 5
b = 0
if b == 0:
    print("Ошибка: деление на ноль")
else:
    print(a / b)

Та же проверка нужна для операций // и %: остаток от деления на ноль тоже вызывает ZeroDivisionError. Вторая опасность — буквы вместо цифр. Если пользователь введёт «пять», float() выдаст ValueError. Защититься можно конструкцией try/except, которая перехватывает ошибку и даёт программе продолжить работу.

text = "пять"
try:
    x = float(text)
    print("Число:", x)
except ValueError:
    print("Это не число")

Не стоит оборачивать в try всю программу целиком: так спрячутся и настоящие ошибки в коде. Внутри try должна быть только та строка, которая может упасть из-за ввода. Разбор этой ошибки с примерами есть на странице про ZeroDivisionError в Python.

Калькулятор с функцией calc

Функция calc — это способ упаковать выбор операции в одно место: она принимает два числа и знак, а возвращает результат. Тогда основной код становится коротким, а логику удобно проверять отдельно.

def calc(a, op, b):
    if op == "+":
        return a + b
    if op == "-":
        return a - b
    if op == "*":
        return a * b
    if op == "/":
        if b == 0:
            return "деление на ноль"
        return a / b
    return "неизвестная операция"

print(calc(8, "*", 7))
print(calc(9, "/", 0))
56
деление на ноль

Команда return сразу завершает функцию, поэтому вместо elif здесь достаточно простых if: до следующей проверки дело дойдёт, только если предыдущая не сработала. Функцию можно проверить вызовами с известным ответом, не вводя ничего с клавиатуры. Как работают параметры и возвращаемые значения, объясняет урок о функциях Python.

Цикл: считать, пока не надоест

Если обернуть калькулятор в цикл while True, он будет решать пример за примером, пока пользователь не напишет «выход». Это 3 новые строки к уже готовому коду.

while True:
    op = input("Операция или выход: ")
    if op == "выход":
        break
    a = float(input("Первое число: "))
    b = float(input("Второе число: "))
    if op == "+":
        print(a + b)
    elif op == "*":
        print(a * b)

Команда break прерывает цикл, и программа завершается. Без неё калькулятор работал бы бесконечно, и остановить его можно было бы только принудительно. Ещё одно полезное улучшение — «память»: переменная, в которой хранится последний ответ, чтобы следующий пример начинать с него. Такая версия есть в задаче 7 тренажёра.

Почему 0.1 + 0.2 не равно 0.3

Если сложить 0.1 и 0.2, Python выведет 0.30000000000000004 — это не ошибка вашего кода, а особенность хранения дробных чисел в двоичном виде. Компьютер не может точно записать 0.1, как мы не можем точно записать треть десятичной дробью.

>>> 0.1 + 0.2
0.30000000000000004
>>> round(0.1 + 0.2, 2)
0.3

Для калькулятора это значит, что ответ стоит округлять функцией round() до разумного числа знаков. Сравнивать дробные результаты через == тоже не рекомендуется: надёжнее проверять, что разница меньше маленького порога. Почему так происходит, станет понятнее после темы о двоичной системе, которую по федеральной образовательной программе изучают в 8 классе[2].

Задачи: калькулятор на Python с автопроверкой

В тренажёре над статьёй 7 задач: от суммы двух чисел до калькулятора с памятью. Напишите код, нажмите «✓ Проверить», и решение запустится на нескольких тестах.

Справа появится список тестов: пройден или не пройден, а для неудачных — «Ожидалось» и «Получилось». Чаще всего расхождение в мелочах: лишний пробел, слово с большой буквы, 3.0 вместо 3. Кнопка «Подсказка» даёт наводку, «Показать решение» — готовый код, но открывать его стоит только после нескольких своих попыток. Самостоятельное решение задач закрепляет материал лучше, чем чтение готовых ответов[3]. Похожие задачи встречаются и в школьном курсе: по материалам ФИПИ, в задании 16 ОГЭ по информатике нужно написать программу на универсальном языке, и Python входит в список разрешённых. Ещё больше упражнений на арифметику — в подборке задач на переменные и print.

Когда самодельный калькулятор не подходит

Учебный калькулятор на Python не подходит для точных расчётов: её задача — научить условиям и функциям, а не заменить настоящий калькулятор. Вот 4 ограничения.

  • Выражения со скобками. Пример вроде (2 + 3) * 4 требует разбора приоритетов, а наша версия считает только 1 действие за раз.
  • Денежные расчёты до копейки. Дробные числа дают погрешность в 16–17-м знаке; для денег нужны целые копейки или модуль decimal.
  • Тригонометрия и логарифмы. Для синуса или логарифма нужен модуль math, а наша версия знает только 4 действия.
  • Ребёнку 7–8 лет без опыта ввода. Сначала стоит попробовать print и input в первой программе.

«Python плохо считает, раз 0.1 + 0.2 даёт странный ответ». Это миф: так же ведут себя дробные числа почти во всех языках программирования, потому что стандарт хранения у них общий. Целые числа Python считает точно при любом размере.

«Функция eval — лучший способ сделать калькулятор». Это не подтверждается практикой: eval выполняет любой введённый код, а не только арифметику, поэтому для учебных программ её не советуют, и навыка разбирать ввод она не даёт.

Чего делать нельзя

Нельзя считать калькулятор готовым, пока он не проверен на нуле, отрицательных числах и неверном знаке. Ещё 6 правил:

  • Нельзя делить, не проверив делитель на ноль.
  • Не стоит складывать строки из input без int() или float() — получится склейка.
  • Не следует сравнивать дробные результаты через ==, лучше округлить или сравнить разницу с порогом.
  • Не стоит писать всю программу внутри try: настоящие ошибки станут невидимыми.
  • Нельзя забывать else в цепочке операций — неверный знак останется без ответа.
  • Не допускается называть переменную sum или input: вы перекроете встроенные функции.

Пробелы вокруг знаков операций в примерах расставлены по руководству PEP 8 — так код легче читать.

Источники

[1] The Python Tutorial (официальная документация Python 3). Python Software Foundation.

[2] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».

[3] Roediger H. L., Karpicke J. D. Test-enhanced learning: Taking memory tests improves long-term retention // Psychological Science. 2006. Vol. 17, № 3. P. 249–255.

[4] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.

Вопросы и ответы

Почему 6 / 2 выводит 3.0?

Обычное деление в Python 3 всегда возвращает дробное число. Если нужен целый результат, используйте // или int().

Как добавить возведение в степень?

Добавьте ещё одну ветку elif op == "**" или elif op == "^" и выведите a ** b. Остальной код менять не нужно.

Как ввести пример одной строкой?

Попросите вводить через пробелы, например «12 + 30», и разрежьте строку методом split() на три части. Так сделано в задаче 4.

Как посчитать квадратный корень?

Подключите модуль math и вызовите math.sqrt(x), либо возведите число в степень 0.5. Для отрицательных чисел sqrt выдаст ошибку.

Сколько строк в полном калькуляторе на Python?

Версия с четырьмя действиями, проверкой нуля и циклом занимает 25–30 строк. С функцией и защитой от букв — около 40.

Можно ли добавить кнопки и окно?

Можно, но для этого нужна библиотека графического интерфейса и установленный Python. Начинать лучше с текстовой версии: логика та же, а отвлекающих деталей меньше.