Untitled
user_3579462654
python
3 years ago
6.6 kB
40
Indexable
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('')
Editor is loading...