Калькулятор на 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 + 2 | 9 |
- | вычитание | 7 - 2 | 5 |
* | умножение | 7 * 2 | 14 |
/ | деление, результат всегда дробный | 6 / 2 | 3.0 |
// | целая часть от деления | 7 // 2 | 3 |
% | остаток от деления | 7 % 2 | 1 |
** | возведение в степень | 7 ** 2 | 49 |
Обратите внимание на деление: 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. Начинать лучше с текстовой версии: логика та же, а отвлекающих деталей меньше.