Простой калькулятор на Python

В последние годы цифровой мир всё больше использует облачные системы. Сервисы вроде cloud.timeweb.com доказали своё удобство и надёжность, мгновенно обрабатывая гигантские объёмы информации. Но сегодня мы вспомним основы современных технологий и расскажем вам, как написать программу-калькулятор своими руками.

Простой Калькулятор На Python (1)

В начале работы над калькулятором вспомним, из чего он состоит и как он работает. Мы будем писать аналог простого настольного калькулятора, который есть у каждого школьника. Прочитав эту статью и выполнив все задания, вы получите готовый код на питоне простейшего калькулятора.

У настольного калькулятора есть:

  •     Кнопки с цифрами
  •     Кнопки с математическими операциями
  •     Дисплей
  •     Микросхемки внутри

В функции настольного калькулятора входит:

  •     Сложение
  •     Вычитание
  •     Деление 
  •     Умножение
  •     Сброс операции
  •     Сохранение результата
  •     Вычисление процента
  •     Взятие корня числа

Для понимания принципа написания калькулятора возьмем из этого списка минимальный набор функций:

  •     Ввод чисел
  •     Вывод результата
  •     Сложение
  •     Вычитание
  •     Деление
  •     Умножение

Код можно писать прямо в онлайн-редакторе.

Например:

Примеры кода математических операций

Математические операции, которые будем использовать:

2+2
4

10-5
5

3*3
9

12/4
3.0

Вывод значения

Чтобы видеть результат, его нужно вывести на экран. Для этого существует функция print(), которая выводит аргументы в скобках в консоль.

print(4 * 4)
16

Эта функция будет аналогом дисплея нашего калькулятора.

Сохранение результата в переменную

Чтобы не производить вычисления внутри функции print(), будем хранить их в переменной.

result = 16 / 8

Далее мы сможем вывести в консоль значение переменной.

print(result)
2.0

Чтение строк

С дисплеем разобрались, теперь используем Python 3 для создания ввода с клавиатуры. У нас есть кнопки с цифрами на клавиатуре, чтобы передать их программе, существует функция input(). При вызове она считывает любые символы с клавиатуры до тех пор, пока не будет нажата клавиша Enter. После этого она возвращает результат в виде строки из введённых символов. Давайте посмотрим, как это работает:

text = input() # Hi
Hi

Выведем результат на экран.

print(text)
Hi

Если передать внутрь функции input() текст, то он выводится на экран перед тем, как начнётся считывание строки.

username = input('Enter your name: ') # Иван
print(username)
Enter your name: Иван
Иван

Объединение и форматирование строк

Чтобы вывод данных стал более дружелюбным, мы можем добавить пояснения к ним. Для этого используем объединение (конкатенацию) строк.

print('Hello, ' + username + '!')
Hello, Иван!

Ещё один способ объединения текста с данными — использование форматированных строк. Для этого перед кавычками необходимо поставить символ f, а данные записывать прямо внутри строки в фигурных скобках. Такой функционал появился с версии Python 3.6.0.

print(f'Hello, {username}!')
Hello, Иван!

Перевод строк в число

Теперь, когда мы умеем производить математические операции, считывать данные с клавиатуры и красиво выводить результат в консоль, давайте наконец-то напишем первую версию калькулятора! Для простоты пусть он пока будет только складывать числа, но это уже будет готовый пример кода программы на Питон.

# Считываем данныеa = input('Введите первое число: ')
b = input('Введите второе число: ')​

# Производим вычисления
result = a + b

# Выводим результат в консоль
print(f'Сумма чисел {a} и {b} равняется: {result}')

Введите первое число: 12
Введите второе число: 55
Сумма чисел 12 и 55 равняется: 1255

Что-то пошло не так. Числа не сложились, а объединились как текст. Дело в том, что input() в Python возвращает ввод строки с клавиатуры, даже если вы вводили только числа. Такое поведение более явное, что соответствует философии Python: «Явное лучше, чем неявное». Для того чтобы исправить возникшую ошибку, используем функцию перевода строки в число: int(). Посмотрим на примере, как работает num int input:

num = int(input())
print(num + 10)
32
42

Отредактируем нашу программу.

# Считываем данныеa = int(input('Введите первое число: '))
b = int(input('Введите второе число: '))

# Производим вычисления
result = a + b

# Выводим результат в консоль
print(f'Сумма чисел {a} и {b} равняется: {result}')

Введите первое число: 12
Введите второе число: 55
Сумма чисел 12 и 55 равняется: 67

Обработка некорректных данных

Но что если пользователь введёт не числа, а буквы или другие символы? При попытке перевести такую строку в число Python выдаст ошибку и остановит выполнение программы.

int(input('Введите первое число: '))
Введите первое число: abc
------------------------------------------------------------------------

ValueError  Traceback (most recent call last)
C:\Temp\ipykernel_5404\317567321.py in <module>
----> 1 int(input('Введите первое число: '))

ValueError: invalid literal for int() with base 10: 'abc'

Такие ошибки можно оперативно определять и менять стандартное поведение при их возникновении, например предлагать пользователю ввести число заново. Но это отдельная тема для разговора, поэтому в контексте этой статьи условимся, что пользователь всегда вводит корректные данные.

Создание функций

Итак, у нас есть практически все компоненты для того, чтобы написать полноценный калькулятор. Давайте расширим функционал текущей версии до выполнения всех математических операций, которые мы запланировали:       

  • Сложение
  • Вычитание
  • Деление
  • Умножение

Чтобы улучшить читаемость кода, разделим эти операции на отдельные функции. Смотрите, как это делается на примере суммы.

# Сложение
def sum(a, b):
   result = a + b
   return result

Определяем функцию с помощью ключевого слова def, пишем её название и в скобках указываем, какие параметры она принимает. Далее в теле функции пишем то, что она должна выполнять и возвращаем результат с помощью ключевого слова return .

Обратите внимание, что тело функции записывается с отступами строки — таковы правила создания функции. В противном случае будет ошибка.

def test():
print(123)
 File "C:\Temp\ipykernel_5404\353670293.py", line 2
    print(123)
    ^
IndentationError: expected an indented block

Результат работы функции можно также сохранить в переменную для дальнейшего использования.

x = sum(10, 15)
print(x)
25

Аналогичным образом создадим остальные функции вычисления.

# Вычитаниеdef subtract(a, b):
   result = a - b
   return result

# Умножение
def multiply(a, b):
   result = a * b
   return result

# Деление
def divide(a, b):
   result = a / b
   return result

Условные операторы

Функции операций готовы. Осталось написать простой код на питоне, который предоставит пользователю возможность выбора этих операций. Будем использовать уже знакомый нам ввод с клавиатуры и условные операторы. Условные операторы работают очень просто. Их название говорит само за себя.

Если условие истинно, например 2 == 2,
то выполняем один блок кода ,
иначе
выполняем другой блок кода

На месте двоек могут быть переменные, функции, возвращающие значения, строки и даже математические операции. Посмотрим, как это выглядит в коде на примере проверки пароля. Предположим, что верный пароль: qwerty.

# спрашиваем у пользователя пароль
password = input('Введите пароль: ')

# Проверяем, соответствует ли он задуманному нами
if password == 'qwerty':
   print('Верно!')
else:
   print('Неправильный пароль')
Введите пароль: йцукен
Неправильный пароль

# спрашиваем у пользователя пароль
password = input('Введите пароль: ')

# Проверяем, соответствует ли он задуманному нами
if password == 'qwerty':
   print('Верно!')
else:
   print('Неправильный пароль')
Введите пароль: qwerty
Верно!

Обратите внимание, что блоки кода также пишутся с отступами, как и в функциях. Двоеточие также обязательно.

Сразу же применим полученные знания к нашему калькулятору. Будем спрашивать у пользователя, какую операцию он хочет совершить, и, в зависимости от ввода, вызывать соответствующую функцию вычисления. Для начала просто выведем текст выбранной операции или сообщение, что такой операции не существует. Следующим шагом заменим текст на вызов операции и объединим его с уже существующей логикой калькулятора.

# Подготовим сообщение для пользователя о доступных математических операциях.
# В тройных кавычках можно хранить многострочный текст.
message = '''
Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:​

+ : Сложение
- : Вычитание
/ : Деление
* : Умножение

Ваш выбор:
'''​

# Запрашиваем у пользователя желаемое действие
operation = input(message)​

# Выводим сообщение о выбранной операции или что она отсутствует
if operation == '+':
   print('Сложение')
elif operation == '-':
   print('Вычитание')
elif operation == '/':
   print('Деление')
elif operation == '*':
   print('Умножение')
else:
   print('Неизвестная операция') 

Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter: 

+ : Сложение
- : Вычитание
/ : Деление
* : Умножение 

Ваш выбор:
+

Сложение
 

Собираем всё в единое целое

Поместим всю логику вычислений внутрь функции, чтобы мы могли удобно обращаться к ней в коде скрипта.

def calculate(a, b, operation):
   result = None 

   if operation == '+':
       result = sum(a, b)
   elif operation == '-':
       result = subtract(a, b)
   elif operation == '/':
       result = divide(a, b)
   elif operation == '*':
       result = multiply(a, b)
   else:
       print('Неизвестная операция')  
 
   return result

Также добавим функцию для запроса операции.

def ask_operation():
   message = '''
Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:

+ : Сложение
- : Вычитание
/ : Деление
* : Умножение

Ваш выбор:
   '''

   # Запрашиваем у пользователя желаемое действие
   operation = input(message) 

   return operation

Теперь оборачиваем все этапы взаимодействия с калькулятором в условный корпус функции calculate.

def run_calculator():
   # Запрашиваем данные
   a = int(input('Введите первое число: '))
   b = int(input('Введите второе число: '))

   # Запрашиваем тип операции
   operation = ask_operation()

   # Производим вычисления
   result = calculate(a, b, operation)

   # Выводим результат в консоль
   print(f'Результат вычислений: {result}')

Проверяем!

run_calculator()
Введите первое число: 15
Введите второе число: 15

Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:

+ : Сложение
- : Вычитание
/ : Деление
* : Умножение

Ваш выбор:
    *
Результат вычислений: 225

Работает! Поздравляем, только что вы написали свой калькулятор.

Расширение функционала и улучшение кода

Добавление операций

Благодаря тому, что функции вычисления вынесены в отдельные модули calculate python, мы можем с лёгкостью расширять функционал калькулятора.

Давайте добавим операцию возведения в степень.

def pow(a, b):
   result = a ** b
   return result

Добавляем операцию в функцию вычисления.

def calculate(a, b, operation):
   result = None

   if operation == '+':
       result = sum(a, b)

   elif operation == '-':
       result = subtract(a, b)

   elif operation == '/':
       result = divide(a, b)

   elif operation == '*':
       result = multiply(a, b)

​   # Возведение в степень
   elif operation == '^' or operation == '**':
       result = pow(a, b)

   else:
       print('Неизвестная операция')

   return result

Также добавим пояснения в функцию запроса действия.

def ask_operation():
   message = '''
Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:
+ : Сложение
- : Вычитание
/ : Деление
* : Умножение
^ или ** : Возведение в степень
Ваш выбор: '''

   # Запрашиваем у пользователя желаемое действие
   operation = input(message)

   return operation

Проверяем, запустив функцию run_calculator().

run_calculator()
Введите первое число: 2
Введите второе число: 8

Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:
+ : Сложение
- : Вычитание
/ : Деление
* : Умножение
^ или ** : Возведение в степень

Ваш выбор: **
Результат вычислений: 256

Тестирование и обработка ошибок

Сейчас, если мы введём неизвестную операцию, калькулятор выдаст сообщение, что такой операции нет, и оставит всё, как есть. Более того, он выведет сообщения о полученном результате, которого по определению быть не должно. Давайте посмотрим:

run_calculator()
Введите первое число: 3
Введите второе число: 5

Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:
+ : Сложение
- : Вычитание
/ : Деление
* : Умножение
^ или ** : Возведение в степень

Ваш выбор: &
Неизвестная операция
Результат вычислений: None

Ничего страшного не случилось, но и пользы никакой. Такой процесс, когда мы пробуем ввести в программу некорректные данные и наблюдать, как она реагирует, называется тестированием. Это отдельная профессия, но, так или иначе, элементарные тесты должен уметь делать любой программист-профессионал.

Циклы

Давайте изменим поведение программы и позволим пользователю повторно выбрать требуемую операцию.

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

Простой пример. Будем выводить в консоль всё, что введёт пользователь, до тех пор, пока не будет введена пустая строка.

text = None

while text != '':
   text = input('Напишите что-нибудь или оставьте строку пустой, чтобы закончить:\n')
   print(f'Вы ввели: {text}\n')

print('Завершение программы')
Напишите что-нибудь или оставьте строку пустой, чтобы закончить:
123
Вы ввели: 123

Напишите что-нибудь или оставьте строку пустой, чтобы закончить:
test
Вы ввели: test

Напишите что-нибудь или оставьте строку пустой, чтобы закончить:
Вы ввели:

Завершение программы

Теперь применим это к калькулятору.

Для этого изменим функцию запроса операции ask_operation

def ask_operation():
   message = '''
Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:
+ : Сложение
- : Вычитание
/ : Деление
* : Умножение
^ или ** : Возведение в степень

Ваш выбор: '''

   # Создадим список с возможными операциями
   correct_operations = ['+', '-', '/', '*', '^', '**']

   # Первый раз запрашиваем у пользователя желаемое действие
   operation = input(message)
 
 # Запускаем цикл, если операции нет в списке
   while operation not in correct_operations:
       print('Такая операция недоступна. Повторите попытку.')
       operation = input(message)
 
 return operation

Вычисления не производятся до тех пор, пока не будет введена корректная операция. Тест пройден.

Заключение

Сегодня легко найти калькулятор на любой вкус: встроенные в различные приложения, сайты с калькуляторами, обычные физические калькуляторы, разнообразные инженерные модификации, включая такие интересные калькуляторы, как python ipcalc, позволяющий выполнять расчёты IP-подсети. Но что может быть лучше, чем вещь, сделанная и модернизированная своими руками?

Telegram
VK
Скопировать ссылку
Как использовать Axios в React
Как использовать Axios в React
Как пользоваться SSH
Как пользоваться SSH

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону