Untitled
user_3579462654
python
2 years ago
6.6 kB
31
Indexable
Never
from dataclasses import dataclass @dataclass class InfoMessage: """Информационное сообщение о тренировке.""" training_type: str duration: float distance: float speed: float calories: float def get_message(self) -> str: return (f'Тип тренировки: {self.training_type}; ' f'Длительность: {self.duration:.3f} ч.; ' f'Дистанция: {self.distance:.3f} км; ' f'Ср. скорость: {self.speed:.3f} км/ч; ' f'Потрачено ккал: {self.calories:.3f}.') class Training: """Базовый класс тренировки.""" LEN_STEP: float = 0.65 M_IN_KM: int = 1000 def __init__(self, action: int, duration: float, weight: float) -> None: self.action = action self.duration = duration self.weight = weight self.LEN_STEP = 0.65 self.M_IN_KM: int = 1000 self.MIN_IN_HR: int = 60 self.training_type = 'unknown' self.distance = self.get_distance() self.mean_speed = self.get_mean_speed() self.spent_calories = self.get_spent_calories() def get_distance(self) -> float: """Получить дистанцию в км, которую преодолел пользователь за время тренировки. """ return self.action * self.LEN_STEP / self.M_IN_KM def get_mean_speed(self) -> float: """Получить среднюю скорость движения во время тренировки.""" return self.get_distance() / self.duration def get_spent_calories(self) -> float: """Получить количество затраченных калорий. Возвращает количество килокалорий, израсходованных за время тренировки. """ def show_training_info(self) -> InfoMessage: """Вернуть информационное сообщение о выполненной тренировке. Возвращает объект класса сообщения.""" return InfoMessage( type(self).__name__, self.duration, self.distance, self.mean_speed, self.spent_calories) class Running(Training): """Тренировка: бег.""" COEFF_CALORIE_1: float = 18.0 COEFF_CALORIE_2: float = 20.0 def __init__(self, action: int, duration: float, weight: float) -> None: self.COEFF_CALORIE_1 self.COEFF_CALORIE_2 super().__init__(action, duration, weight) self.training_type = 'Running' def get_spent_calories(self) -> float: """Получить количество затраченных калорий для тренировки по бегу. """ return ((self.COEFF_CALORIE_1 * self.get_mean_speed() - self.COEFF_CALORIE_2) * self.weight / self.M_IN_KM * (self.duration * self.MIN_IN_HR)) class Swimming(Training): """Тренировка: плавание.""" COEFF_MIN_SPEED:float = 1.1 COEFF_WEIGHT:float = 2 LEN_STEP:float = 1.38 def __init__(self, action: int, duration: float, weight: float, length_pool: int, count_pool: int) -> None: self.COEFF_MIN_SPEED self.COEFF_WEIGHT self.length_pool: int = length_pool self.count_pool: int = count_pool super().__init__(action, duration, weight) self.training_type: str = 'Swimming' self.distance = self.get_distance() self.LEN_STEP def get_distance(self) -> float: """Получить дистанцию в км, которую преодолел пользователь за время тренировки. """ return self.action * self.LEN_STEP / self.M_IN_KM def get_spent_calories(self) -> float: """Получить количество затраченных калорий.""" return (self.get_mean_speed() + self.COEFF_MIN_SPEED) * self.COEFF_WEIGHT * self.weight def get_mean_speed(self) -> float: """Получить среднюю скорость движения. Возвращает значение средней скорости движения во время тренировки. """ return (self.length_pool * self.count_pool / self.M_IN_KM / self.duration) class SportsWalking(Training): """Тренировка: спортивная ходьба.""" COEFF_CALORIE_3: float = 0.035 COEFF_CALORIE_4: float = 0.029 def __init__(self, action: int, duration: float, weight: float, height: int) -> None: self.COEFF_CALORIE_3 self.COEFF_CALORIE_4 self.height = height super().__init__(action, duration, weight) self.training_type = 'SportsWalking' def get_spent_calories(self) -> float: """Получить количество затраченных калорий для тренировки по бегу.""" return ((self.COEFF_CALORIE_3 * self.weight + (self.get_mean_speed() ** 2 // self.height) * self.COEFF_CALORIE_4 * self.weight) * self.duration * self.MIN_IN_HR) def read_package(workout_type: str, data: list) -> Training: """Прочитать данные полученные от датчиков.""" training_types: dict[str][type] = { 'SWM': Swimming, 'RUN': Running, 'WLK': SportsWalking} return training_types[workout_type](*data) def main(training: Training) -> str: """Главная функция.""" result = training.show_training_info() print(result.get_message()) if __name__ == '__main__': packages = [ ('SWM', [720, 1, 80, 25, 40]), ('RUN', [15000, 1, 75]), ('WLK', [9000, 1, 75, 180])] for workout_type, data in packages: training = read_package(workout_type, data) main(training) print('')