Блог / Статьи

Полезная информация для вашего хостинга

Создаем простой калькулятор на Python

Создаем простой калькулятор на Python

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'

 Чтобы избежать ошибок, можно реализовать проверку корректности ввода с помощью цикла.

calculate2 

Разделение калькулятора на функции

Для удобства и модульности кода каждую арифметическую операцию можно оформить как отдельную функцию. Это позволит легче тестировать и дополнять программу.

Базовые арифметические функции
- Сложение: 

 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

 Условные операторы — основа для построения логики большинства программ.

calculate3

Сборка функций в одну программу `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)

calculate4

Полный код программы

 

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`.