В последние годы цифровой мир всё больше использует облачные системы. Сервисы вроде timeweb.cloud доказали своё удобство и надёжность, мгновенно обрабатывая гигантские объёмы информации. Но сегодня мы вспомним основы современных технологий и расскажем вам, как написать программу-калькулятор своими руками.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
В начале работы над калькулятором вспомним, из чего он состоит и как он работает. Мы будем писать аналог простого настольного калькулятора, который есть у каждого школьника. Прочитав эту статью и выполнив все задания, вы получите готовый код на питоне простейшего калькулятора.
У настольного калькулятора есть:
В функции настольного калькулятора входит:
Для понимания принципа написания калькулятора возьмем из этого списка минимальный набор функций:
Код можно писать прямо в онлайн-редакторе.
Например:
Математические операции, которые будем использовать:
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-подсети. Но что может быть лучше, чем вещь, сделанная и модернизированная своими руками?