Python — это мощный и универсальный язык программирования с понятным синтаксисом, который отлично подходит для начинающих разработчиков. Его возможности охватывают самые разные области — от машинного обучения до создания ботов для Telegram. В этой статье пошагово разберем, как написать простой калькулятор на Python.
Основные функции калькулятора
Калькулятор будет поддерживать базовые арифметические операции:
- сложение;
- вычитание;
- умножение;
- деление.
Кроме того, добавим несколько дополнительных функций:
- вычисление процента от числа;
- возведение числа в степень;
- нахождение логарифма числа.
Например, программа сможет решать такие задачи:
- \( 20 + 30 = 50 \);
- \( 40 - 8 = 32 \);
- \( 9 \times 5 = 45 \);
- \( 25 \div 5 = 5 \).
После определения функций можно приступить к написанию кода.
Вывод данных в программе
Для отображения текста или результата вычислений будем использовать функцию `print()`.
Пример:
print('Создаем калькулятор на Python!')
Результат в консоли:
Создаем калькулятор на Python!
Можно выводить не только текст, но и числа:
print(795)
Результат:
795
Работа с переменными
Для хранения результатов вычислений используют переменные. Рассмотрим пример:
result = 7 * 6
print(result)
Результат:
42
Обработка пользовательского ввода
Чтобы получать данные от пользователя, используется функция `input()`. Она выводит сообщение-подсказку и ожидает ввода данных до нажатия клавиши Enter.
Пример:
name = input('Введите ваше имя: ') # Иван
surname = input('Введите вашу фамилию: ') # Петров
print('Ваше имя и фамилия:')
print(name)
print(surname)
Результат в консоли:
Введите ваше имя: Иван
Введите вашу фамилию: Петров
Ваше имя и фамилия:
Иван
Петров
Если в программе требуется много ввода, использование строки-подсказки в `input()` помогает пользователю лучше понимать, какие данные от него ожидаются.
Практическая работа с пользовательским вводом
Базовый пример работы с вводом
Вот как выглядит пример программы, запрашивающей имя и фамилию пользователя:
name = input('Укажите имя: ') # Иван
surname = input('Укажите фамилию: ') # Петров
print('Ваше имя и фамилия:')
print(name)
print(surname)
Результат:
Укажите имя: Иван
Укажите фамилию: Петров
Ваше имя и фамилия:
Иван
Петров
По умолчанию каждый вызов функции `print()` завершает вывод переходом на новую строку. Однако это поведение можно изменить, используя параметр `end`.
Вывод текста в одной строке
Чтобы текст выводился в одной строке, используйте параметр `end` с аргументом-пробелом:
name = input('Укажите имя: ') # Иван
surname = input('Укажите фамилию: ') # Петров
print('Ваше имя и фамилия: ', end=' ')
print(name, end=' ')
print(surname)
Результат:
Укажите имя: Иван
Укажите фамилию: Петров
Ваше имя и фамилия: Иван Петров
Объединение строк
Для более лаконичного кода можно использовать объединение (конкатенацию) строк. Например:
name = input('Укажите имя: ') # Федор
surname = input('Укажите фамилию: ') # Смирнов
print('Ваше имя и фамилия: ' + name + ' ' + surname)
Результат:
Укажите имя: Федор
Укажите фамилию: Смирнов
Ваше имя и фамилия: Федор Смирнов
При использовании этого подхода важно помнить о добавлении пробелов между словами.
Форматирование строк с помощью f-строк
Ещё один удобный способ объединить строки — использовать f-строки, которые делают код более читаемым:
name = input('Укажите имя: ') # Федор
surname = input('Укажите фамилию: ') # Смирнов
print(f'Ваше имя и фамилия: {name} {surname}')
Результат:
Укажите имя: Федор
Укажите фамилию: Смирнов
Ваше имя и фамилия: Федор Смирнов
Использование f-строк считается современным и удобным решением, поскольку оно позволяет интегрировать переменные непосредственно в текст без необходимости конкатенации.
Конвертация строк в числа
При использовании функции `input()` вводимые значения автоматически воспринимаются как строки, что может привести к ошибкам при выполнении арифметических операций.
Пример некорректного кода:
first = input('Укажите первое число: ') # 70
second = input('Укажите второе число: ') # 300
summ = first + second
print(f'Сумма чисел: {summ}')
Результат:
Укажите первое число: 70
Укажите второе число: 300
70300
Корректное решение
Чтобы арифметические операции выполнялись правильно, строки нужно преобразовать в числа с помощью функции `int()`.
first = int(input('Укажите первое число: ')) # 70
second = int(input('Укажите второе число: ')) # 300
summ = first + second
print(f'Сумма чисел: {summ}')
Результат:
Укажите первое число: 70
Укажите второе число: 300
Сумма чисел: 370
Обработка ошибок
Если пользователь вводит текст вместо числа, программа вызовет ошибку `ValueError`.
first = int(input('Укажите первое число: ')) # abc
Результат:
Укажите первое число: abc
ValueError: invalid literal for int() with base 10: 'abc'
Чтобы избежать ошибок, можно реализовать проверку корректности ввода с помощью цикла.
Разделение калькулятора на функции
Для удобства и модульности кода каждую арифметическую операцию можно оформить как отдельную функцию. Это позволит легче тестировать и дополнять программу.
Базовые арифметические функции
- Сложение:
def summa(first, second):
return first + second
- Вычитание:
def sub(first, second):
return first - second
- Умножение:
def mult(first, second):
return first * second
- Деление:
def div(first, second):
return first / second
Проверка работы функций
num1 = int(input('Введите первое число: ')) # 10
num2 = int(input('Введите второе число: ')) # 5
print(f'Сумма двух чисел: {summa(num1, num2)}, разность: {sub(num1, num2)}, '
f'умножение: {mult(num1, num2)}, частное: {div(num1, num2)}')
Результат:
Введите первое число: 10
Введите второе число: 5
Сумма двух чисел: 15, разность: 5, умножение: 50, частное: 2.0
Преимущества подхода
1. Модульность: каждая функция отвечает за выполнение одной операции.
2. Удобство тестирования: каждую функцию можно проверить отдельно.
3. Расширяемость: в дальнейшем можно легко добавить новые функции, такие как возведение в степень или расчет процента.
Управление потоком выполнения: условные операторы (`if`)
Условные операторы в Python позволяют направлять выполнение программы в зависимости от выполнения условий.
Базовый `if`
Конструкция `if` проверяет условие, и если оно истинно, выполняется соответствующий блок кода.
Пример:
num1 = int(input('Введите первое число: '))
num2 = int(input('Введите второе число: '))
if num1 == num2:
print('Одинаковые числа')
Результат:
Введите первое число: 9
Введите второе число: 9
Одинаковые числа
Если числа разные, программа просто завершится без выполнения инструкций, так как код для этого случая не предусмотрен:
Введите первое число: 9
Введите второе число: 7
(ничего не происходит)
`if-else`: альтернативные действия
Конструкция `if-else` позволяет выполнить одну из двух альтернатив в зависимости от условия.
Пример:
num1 = int(input('Введите первое число: '))
num2 = int(input('Введите второе число: '))
if num1 == num2:
print('Одинаковые числа')
else:
print('Числа разные')
Результат:
Введите первое число: 10
Введите второе число: 20
Числа разные
`if-elif-else`: несколько условий
Когда нужно проверить несколько условий, используется конструкция `if-elif-else`.
Пример выбора операции:
oper = input('Выберите операцию (Введите +, -, * или /): ')
if oper == '+':
print('Вы выбрали сумму')
elif oper == '-':
print('Вы выбрали разность')
elif oper == '*':
print('Вы выбрали умножение')
elif oper == '/':
print('Вы выбрали деление')
else:
print('Некорректная операция!')
Результаты:
Выберите операцию (Введите +, -, * или /): *
Вы выбрали умножение
```
```
Выберите операцию (Введите +, -, * или /): Y
Некорректная операция!
Зачем нужны условные операторы
Условные операторы позволяют:
1. Контролировать поток выполнения программы. Например, выполнять разные действия в зависимости от ввода пользователя.
2. Обрабатывать пользовательский ввод. Например, проверять корректность данных.
3. Упрощать взаимодействие с программой. Предлагая выбор операций, мы делаем программу более гибкой и понятной.
Пример: калькулятор с выбором операции
num1 = int(input('Введите первое число: '))
num2 = int(input('Введите второе число: '))
oper = input('Выберите операцию (Введите +, -, *, /): ')
if oper == '+':
print(f'Результат: {num1 + num2}')
elif oper == '-':
print(f'Результат: {num1 - num2}')
elif oper == '*':
print(f'Результат: {num1 * num2}')
elif oper == '/':
if num2 != 0:
print(f'Результат: {num1 / num2}')
else:
print('Ошибка: деление на ноль!')
else:
print('Некорректная операция!')
Результат:
Введите первое число: 15
Введите второе число: 3
Выберите операцию (Введите +, -, *, /): /
Результат: 5.0
Условные операторы — основа для построения логики большинства программ.
Сборка функций в одну программу `calculator`
Для создания полноценного калькулятора мы объединим функции в логичную структуру.
1. Функция `operation()`
Эта функция отвечает за выбор операции пользователем. Она запрашивает символ операции, выводит соответствующее сообщение и возвращает выбранное значение.
def operation():
mes = input('Выберите операцию (Введите +, -, * или /): ')
if mes == '+':
print('Вы выбрали сумму')
elif mes == '-':
print('Вы выбрали разность')
elif mes == '*':
print('Вы выбрали умножение')
elif mes == '/':
print('Вы выбрали деление')
else:
print('Некорректная операция!')
return mes
2. Функция `calc()`
Эта функция выполняет арифметическую операцию в зависимости от переданного оператора. Если операция некорректна, программа уведомляет об этом.
def calc(first, second, oper):
result = None
if oper == '+':
result = summa(first, second)
elif oper == '-':
result = sub(first, second)
elif oper == '*':
result = mult(first, second)
elif oper == '/':
if second != 0:
result = div(first, second)
else:
print('Ошибка: деление на ноль!')
else:
print('Некорректная операция!')
return result
3. Функция `run()`
Главная функция программы, объединяющая все этапы работы. Она запрашивает числа, вызывает выбор операции и выполняет вычисления.
def run():
first = int(input('Введите первое число: '))
second = int(input('Введите второе число: '))
oper = operation()
result = calc(first, second, oper)
if result is not None:
print(f'Результат: {result}')
else:
print('Попробуйте еще раз.')
4. Дополнительные математические функции
Калькулятор использует отдельные функции для выполнения математических операций:
def summa(first, second):
return first + second
def sub(first, second):
return first - second
def mult(first, second):
return first * second
def div(first, second):
return first / second
Полная программа `calculator`
def summa(first, second):
return first + second
def sub(first, second):
return first - second
def mult(first, second):
return first * second
def div(first, second):
return first / second
def operation():
mes = input('Выберите операцию (Введите +, -, * или /): ')
if mes == '+':
print('Вы выбрали сумму')
elif mes == '-':
print('Вы выбрали разность')
elif mes == '*':
print('Вы выбрали умножение')
elif mes == '/':
print('Вы выбрали деление')
else:
print('Некорректная операция!')
return mes
def calc(first, second, oper):
result = None
if oper == '+':
result = summa(first, second)
elif oper == '-':
result = sub(first, second)
elif oper == '*':
result = mult(first, second)
elif oper == '/':
if second != 0:
result = div(first, second)
else:
print('Ошибка: деление на ноль!')
else:
print('Некорректная операция!')
return result
def run():
first = int(input('Введите первое число: '))
second = int(input('Введите второе число: '))
oper = operation()
result = calc(first, second, oper)
if result is not None:
print(f'Результат: {result}')
else:
print('Попробуйте еще раз.')
Примеры работы
1. Сложение:
Введите первое число: 7
Введите второе число: 10
Выберите операцию (Введите +, -, * или /): +
Вы выбрали сумму
Результат: 17
2. Умножение:
Введите первое число: 7
Введите второе число: 10
Выберите операцию (Введите +, -, * или /): *
Вы выбрали умножение
Результат: 70
3. Некорректная операция:
Введите первое число: 7
Введите второе число: 10
Выберите операцию (Введите +, -, * или /): er
Некорректная операция!
Попробуйте еще раз.
Такой подход делает программу гибкой, легкой в поддержке и удобной для пользователя.
Расширение функционала калькулятора
Расширим калькулятор, добавив новые математические операции: процент, возведение в степень и логарифм. Для этого обновим функции `calc()` и `operation()`.
1. Обновленная функция `calc()`
Добавлены новые операции:
- `%` — процент первого числа от второго;
- `` — возведение первого числа в степень второго;
- `log` — логарифм первого числа по основанию второго (требует импортирования библиотеки `math`).
import math
def calc(first, second, oper):
result = None
if oper == '+':
result = first + second
elif oper == '-':
result = first - second
elif oper == '*':
result = first * second
elif oper == '/':
if second != 0:
result = first / second
else:
print('Ошибка: деление на ноль!')
elif oper == '%':
result = (first / second) * 100
elif oper == '':
result = first second
elif oper == 'log':
if first > 0 and second > 0 and second != 1:
result = math.log(first, second)
else:
print('Ошибка: логарифм невозможен с указанными значениями!')
else:
print('Неизвестная операция!')
return result
2. Обновленная функция `operation()`
Добавим новые команды для описания расширенного набора операций.
def operation():
mes = input('''Выберите операцию (Введите +, -, *, /, %, , log):
+ - Сложение
- - Вычитание
* - Умножение
/ - Деление
% - Процент первого числа от второго
- Возведение в степень
log - Логарифм первого числа по основанию второго\n''')
if mes == '+':
print('Вы выбрали сложение')
elif mes == '-':
print('Вы выбрали вычитание')
elif mes == '*':
print('Вы выбрали умножение')
elif mes == '/':
print('Вы выбрали деление')
elif mes == '%':
print('Вы выбрали нахождение процента первого числа от второго')
elif mes == '':
print('Вы выбрали возведение в степень')
elif mes == 'log':
print('Вы выбрали логарифм')
else:
print('Неизвестная операция!')
return mes
3. Обновленная функция `run()`
Функция вызывает операции и выводит результат, учитывая расширенный функционал.
def run():
first = float(input('Введите первое число: '))
second = float(input('Введите второе число: '))
oper = operation()
result = calc(first, second, oper)
if result is not None:
print(f'Результат: {result}')
else:
print('Попробуйте еще раз.')
Пример работы расширенного калькулятора
Пример 1: Процент первого числа от второго
Введите первое число: 30
Введите второе число: 100
Выберите операцию (Введите +, -, *, /, %, , log):
% - Процент первого числа от второго
Вы выбрали нахождение процента первого числа от второго
Результат: 30.0
Пример 2: Возведение числа в степень
Введите первое число: 2
Введите второе число: 3
Выберите операцию (Введите +, -, *, /, %, , log):
- Возведение первого числа в степень второго
Вы выбрали возведение в степень
Результат: 8.0
Пример 3: Логарифм числа
Введите первое число: 100
Введите второе число: 10
Выберите операцию (Введите +, -, *, /, %, , log):
log - Логарифм первого числа по основанию второго
Вы выбрали логарифм
Результат: 2.0
Итог
Теперь калькулятор поддерживает базовые и расширенные математические операции, а пользователю предоставляются пояснения для каждой функции. Такой подход делает программу интуитивной и многофункциональной.
Ваш калькулятор получился функциональным и удобным для пользователя. Давайте выделим основные моменты, которые улучшают код:
1. Основные улучшения:
- Обработка деления на ноль: Введена проверка на `second == 0` перед выполнением деления, чтобы избежать аварийного завершения программы.
- Обработка ошибок ввода: Использование блока `try-except` предотвращает ошибки при вводе некорректных данных.
- Цикл продолжения работы: Программа продолжает работу по желанию пользователя, запрашивая ввод после каждой операции.
- Проверка операций: Введена валидация списка операций для предотвращения некорректного ввода.
- Понятные инструкции для пользователя: Подробные пояснения о доступных операциях, что делает интерфейс программы интуитивно понятным.
2. Оптимизация кода
Для упрощения можно заменить проверки операций на использование словаря. Это сокращает количество строк и делает код читаемым.
import math
operations = {
'+': ('Сложение', lambda a, b: a + b),
'-': ('Вычитание', lambda a, b: a - b),
'*': ('Умножение', lambda a, b: a * b),
'/': ('Деление', lambda a, b: a / b if b != 0 else 'Деление на ноль запрещено!'),
'%': ('Процент', lambda a, b: (a / b) * 100 if b != 0 else 'Деление на ноль запрещено!'),
'': ('Возведение в степень', lambda a, b: a b),
'log': ('Логарифм', lambda a, b: math.log(a, b) if a > 0 and b > 0 and b != 1 else 'Некорректные данные для логарифма!')
}
Теперь можно переработать функции:
Функция `operation`
def operation():
print("Доступные операции:")
for key, value in operations.items():
print(f"{key} - {value[0]}")
mes = input("\nВыберите операцию: ")
while mes not in operations:
print("Такой операции нет в списке. Попробуйте ещё!")
mes = input()
print(f"Вы выбрали: {operations[mes][0]}")
return mes
Функция `calc`
def calc(first, second, oper):
operation_func = operations[oper][1]
return operation_func(first, second)
Полный код программы
import math
# Описание операций
operations = {
'+': ('Сложение', lambda a, b: a + b),
'-': ('Вычитание', lambda a, b: a - b),
'*': ('Умножение', lambda a, b: a * b),
'/': ('Деление', lambda a, b: a / b if b != 0 else 'Деление на ноль запрещено!'),
'%': ('Процент', lambda a, b: (a / b) * 100 if b != 0 else 'Деление на ноль запрещено!'),
'': ('Возведение в степень', lambda a, b: a b),
'log': ('Логарифм', lambda a, b: math.log(a, b) if a > 0 and b > 0 and b != 1 else 'Некорректные данные для логарифма!')
}
# Выбор операции
def operation():
print("Доступные операции:")
for key, value in operations.items():
print(f"{key} - {value[0]}")
mes = input("\nВыберите операцию: ")
while mes not in operations:
print("Такой операции нет в списке. Попробуйте ещё!")
mes = input()
print(f"Вы выбрали: {operations[mes][0]}")
return mes
# Выполнение операции
def calc(first, second, oper):
operation_func = operations[oper][1]
return operation_func(first, second)
# Основной цикл программы
def run():
while True:
try:
first = float(input("Введите первое число: "))
second = float(input("Введите второе число: "))
op = operation()
result = calc(first, second, op)
print(f"Результат: {result}\n")
except ValueError:
print("Ошибка: Введите числовое значение!\n")
continue
# Повтор программы
answer = input("Желаете продолжить? (+ для продолжения, любой другой символ для выхода): ")
if answer != '+':
print("Завершение программы.")
break
# Запуск программы
run()
Примеры работы
Пример 1: Деление на ноль
Введите первое число: 10
Введите второе число: 0
Выберите операцию: /
Вы выбрали: Деление
Результат: Деление на ноль запрещено!
Пример 2: Неверный ввод операции
Введите первое число: 10
Введите второе число: 20
Выберите операцию: sqrt
Такой операции нет в списке. Попробуйте ещё!
Выберите операцию: +
Вы выбрали: Сложение
Результат: 30.0
Пример 3: Продолжение работы
Введите первое число: 2
Введите второе число: 3
Выберите операцию:
Вы выбрали: Возведение в степень
Результат: 8.0
Желаете продолжить? (+ для продолжения, любой другой символ для выхода): +
Введите первое число: 10
Введите второе число: 100
Выберите операцию: %
Вы выбрали: Процент
Результат: 10.0
Заключение
Калькулятор стал компактным, устойчивым к ошибкам и удобным в использовании. Такой подход позволяет легко добавлять новые функции, изменяя только словарь `operations`.