📋 Оглавление
- Введение
- Функционал
- Установка и проверка
- Полный код
- Использование
- Расширения
🚀 Введение
В этой статье мы создадим полнофункциональный калькулятор на Python с использованием современных возможностей языка. Калькулятор будет включать не только базовые операции, но и расширенный функционал с историей вычислений, статистикой и сохранением результатов.
💫 Функционал
✅ Основные возможности:
- Базовые операции: +, -, *, /, возведение в степень, остаток от деления
- Расширенные операции: целочисленное деление, квадратный корень, тригонометрия
- История вычислений: полная запись всех операций
- Статистика: анализ ваших вычислений
- Сохранение в файл: экспорт истории
- Отмена операций: возможность отменить последнее действие
🔧 Установка и проверка
Проверка версии Python:
bash
# Для Windows обычно:
python --version
# Для Linux/MacOS обычно:
python3 --version
# Если команды не работают, скачайте Python с официального сайта:
# https://www.python.org/downloads/
Важно: Этот код требует Python 3.10+ из-за использования match case!
💻 Полный код калькулятора
python
import operator
import math
from typing import Dict, Callable, List, Union, Any
class SmartCalculator:
"""Умный калькулятор с историей и расширенными функциями"""
def __init__(self):
# Бинарные операции (два числа)
self.operations: Dict[str, Callable[[float, float], float]] = {
'+': operator.add,
'-': operator.sub,
'*': operator.mul,
'/': operator.truediv,
'**': operator.pow,
'%': operator.mod,
'//': operator.floordiv
}
# Унарные операции (одно число)
self.unary_operations: Dict[str, Callable[[float], float]] = {
'sqrt': math.sqrt,
'abs': abs,
'sin': math.sin,
'cos': math.cos,
'tan': math.tan,
'log': math.log10,
'ln': math.log,
'factorial': math.factorial,
}
self.history: List[Dict[str, Any]] = []
def calculate(self, num1: float, num2: float, operation: str) -> float:
"""Выполняет операцию над двумя числами"""
if operation not in self.operations:
raise ValueError(f"Неизвестная операция: {operation}")
# Проверка деления на ноль
if operation in ['/', '//', '%'] and num2 == 0:
raise ZeroDivisionError("Ошибка: деление на ноль!")
result = self.operations[operation](num1, num2)
# Сохраняем в историю
self.history.append({
'type': 'binary',
'num1': num1,
'num2': num2,
'operation': operation,
'result': result
})
return result
def unary_calculate(self, num: float, operation: str) -> float:
"""Выполняет операцию над одним числом"""
if operation not in self.unary_operations:
raise ValueError(f"Неизвестная унарная операция: {operation}")
# Специальные проверки
if operation == 'factorial' and (num < 0 or not num.is_integer()):
raise ValueError("Факториал только для целых неотрицательных чисел")
if operation in ['log', 'ln'] and num <= 0:
raise ValueError("Логарифм только для положительных чисел")
if operation == 'sqrt' and num < 0:
raise ValueError("Квадратный корень только для неотрицательных чисел")
result = self.unary_operations[operation](num)
self.history.append({
'type': 'unary',
'num1': num,
'operation': operation,
'result': result
})
return result
def show_history(self) -> None:
"""Показывает историю вычислений"""
if not self.history:
print("📝 История пуста")
return
print("\n📜 История вычислений:")
print("=" * 50)
for i, calc in enumerate(self.history, 1):
if calc['type'] == 'binary':
print(f"{i:2d}. {calc['num1']} {calc['operation']} {calc['num2']} = {calc['result']}")
else:
print(f"{i:2d}. {calc['operation']}({calc['num1']}) = {calc['result']}")
print("=" * 50)
def clear_history(self) -> None:
"""Очищает историю"""
self.history.clear()
print("✅ История очищена")
def undo_last(self) -> None:
"""Отменяет последнюю операцию"""
if not self.history:
print("❌ Нечего отменять")
return
last_calc = self.history.pop()
if last_calc['type'] == 'binary':
print(f"↶ Отменено: {last_calc['num1']} {last_calc['operation']} {last_calc['num2']} = {last_calc['result']}")
else:
print(f"↶ Отменено: {last_calc['operation']}({last_calc['num1']}) = {last_calc['result']}")
def get_statistics(self) -> Dict[str, Union[int, float, str]]:
"""Возвращает статистику вычислений"""
if not self.history:
return {}
total = len(self.history)
binary_ops = len([c for c in self.history if c['type'] == 'binary'])
unary_ops = len([c for c in self.history if c['type'] == 'unary'])
# Самая частая операция
operations = [calc['operation'] for calc in self.history]
most_used = max(set(operations), key=operations.count) if operations else "Нет данных"
return {
'Всего операций': total,
'Бинарных операций': binary_ops,
'Унарных операций': unary_ops,
'Последний результат': self.history[-1]['result'],
'Самая частая операция': most_used
}
def save_to_file(self, filename: str = "calculator_history.txt") -> None:
"""Сохраняет историю в файл"""
if not self.history:
print("❌ История пуста")
return
try:
with open(filename, 'w', encoding='utf-8') as f:
f.write("История вычислений калькулятора\n")
f.write("=" * 40 + "\n")
for i, calc in enumerate(self.history, 1):
if calc['type'] == 'binary':
f.write(f"{i}. {calc['num1']} {calc['operation']} {calc['num2']} = {calc['result']}\n")
else:
f.write(f"{i}. {calc['operation']}({calc['num1']}) = {calc['result']}\n")
print(f"✅ История сохранена в файл: {filename}")
except Exception as e:
print(f"❌ Ошибка сохранения: {e}")
def get_number(prompt: str) -> float:
"""Безопасный ввод числа"""
while True:
try:
return float(input(prompt))
except ValueError:
print("❌ Ошибка! Введите корректное число.")
def get_operation(available_ops: list) -> str:
"""Безопасный ввод операции"""
while True:
op = input(f"Выберите операцию {available_ops}: ")
if op in available_ops:
return op
print(f"❌ Доступные операции: {available_ops}")
def show_available_operations(calc: SmartCalculator) -> None:
"""Показывает доступные операции"""
print("\n🔧 Доступные операции:")
print(f"Бинарные: {list(calc.operations.keys())}")
print(f"Унарные: {list(calc.unary_operations.keys())}")
def main():
"""Главная функция программы"""
calc = SmartCalculator()
print("🎯 УМНЫЙ КАЛЬКУЛЯТОР PYTHON")
print("=" * 50)
while True:
print("\n📋 ГЛАВНОЕ МЕНЮ:")
print("1. ➕ Бинарная операция (+, -, *, /, **, %)")
print("2. 🔢 Унарная операция (sqrt, sin, cos, log, etc.)")
print("3. 📜 Показать историю")
print("4. 📊 Статистика вычислений")
print("5. 🔍 Показать доступные операции")
print("6. 💾 Сохранить историю в файл")
print("7. ↩️ Отменить последнюю операцию")
print("8. 🗑️ Очистить историю")
print("9. 🚪 Выход")
choice = input("\nВыберите действие (1-9): ")
match choice:
case '1':
try:
num1 = get_number("Введите первое число: ")
num2 = get_number("Введите второе число: ")
operation = get_operation(list(calc.operations.keys()))
result = calc.calculate(num1, num2, operation)
print(f"\n✅ Результат: {num1} {operation} {num2} = {result}")
except (ValueError, ZeroDivisionError) as e:
print(f"❌ Ошибка: {e}")
case '2':
try:
num = get_number("Введите число: ")
operation = get_operation(list(calc.unary_operations.keys()))
result = calc.unary_calculate(num, operation)
print(f"\n✅ Результат: {operation}({num}) = {result}")
except (ValueError, Exception) as e:
print(f"❌ Ошибка: {e}")
case '3':
calc.show_history()
case '4':
stats = calc.get_statistics()
if stats:
print("\n📈 СТАТИСТИКА:")
print("-" * 30)
for key, value in stats.items():
print(f"{key}: {value}")
print("-" * 30)
else:
print("📊 История пуста")
case '5':
show_available_operations(calc)
case '6':
filename = input("Введите имя файла (по умолчанию calculator_history.txt): ").strip()
calc.save_to_file(filename or "calculator_history.txt")
case '7':
calc.undo_last()
case '8':
calc.clear_history()
case '9':
print("\n👋 До свидания! Спасибо за использование калькулятора!")
break
case _:
print("❌ Неверный выбор! Попробуйте снова.")
if __name__ == "__main__":
main()
🎯 Использование программы
Пример сессии:
text
🎯 УМНЫЙ КАЛЬКУЛЯТОР PYTHON
==================================================
📋 ГЛАВНОЕ МЕНЮ:
1. ➕ Бинарная операция (+, -, *, /, **, %)
2. 🔢 Унарная операция (sqrt, sin, cos, log, etc.)
...
Выберите действие (1-9): 1
Введите первое число: 10
Введите второе число: 5
Выберите операцию ['+', '-', '*', '/', '**', '%', '//']: *
✅ Результат: 10 * 5 = 50
🚀 Расширения и улучшения
Дополнительные функции которые можно добавить:
python
# 1. Работа с памятью
memory: float = 0
def memory_store(self, value: float):
self.memory = value
def memory_recall(self) -> float:
return self.memory
# 2. Конвертер валют
def convert_currency(self, amount: float, rate: float):
return amount * rate
# 3. Генератор случайных чисел
import random
def random_number(self, start: int, end: int):
return random.randint(start, end)
📊 Итоги
Что мы создали:
- ✅ Полнофункциональный калькулятор
- ✅ Систему истории операций
- ✅ Статистику вычислений
- ✅ Сохранение в файл
- ✅ Обработку ошибок
- ✅ Удобный интерфейс
Преимущества:
- 🐍 Чистый Python код
- 🎯 Современные возможности (3.10+)
- 📱 Простота использования
- 🔧 Легкость расширения
💡 Советы для новичков
- Изучайте код постепенно - начните с базовых операций
- Экспериментируйте - добавляйте свои функции
- Используйте отладку - если что-то не работает
- Читайте ошибки - они подскажут что не так
Статья написана для образовательных целей. Код полностью рабочий и протестирован.
Теги: #Python #Программирование #Калькулятор #Обучение #Код #Разработка