Advertisement
Pug_coder

Untitled

Nov 26th, 2022
1,340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.96 KB | None | 0 0
  1. class InfoMessage:
  2.     """Информационное сообщение о тренировке."""
  3.     def __init__(self,
  4.                  training_type: str,
  5.                  duration: float,
  6.                  distance: float,
  7.                  speed: float,
  8.                  calories: float
  9.                  ) -> None:
  10.         self.training_type = training_type
  11.         self.duration = duration
  12.         self.distance = distance
  13.         self.speed = speed
  14.         self.calories = calories
  15.  
  16.     def get_message(self) -> str:
  17.         return (
  18.             f'Тип тренировки: {self.training_type}; '
  19.             f'Длительность: {"{:.3f}".format(self.duration)} ч.; '
  20.             f'Дистанция: {"{:.3f}".format(self.distance)} км; '
  21.             f'Ср.скорость: {"{:.3f}".format(self.speed)} км / ч; '
  22.             f'Потрачено ккал: {"{:.3f}".format(self.calories)}.'
  23.         )
  24.  
  25.  
  26. class Training:
  27.     """Базовый класс тренировки."""
  28.     LEN_STEP: float = 0.65
  29.     M_IN_KM: int = 1000
  30.     MIN_IN_H: int = 60
  31.     KMH_IN_MSEC: float = 0.278
  32.  
  33.     def __init__(self,
  34.                  action: int,
  35.                  duration: float,
  36.                  weight: float,
  37.                  ) -> None:
  38.         self.action = action
  39.         self.duration = duration
  40.         self.weight = weight
  41.  
  42.     def get_distance(self) -> float:
  43.         """Получить дистанцию в км."""
  44.         return self.action * self.LEN_STEP / self.M_IN_KM
  45.  
  46.     def get_mean_speed(self) -> float:
  47.         """Получить среднюю скорость движения."""
  48.         training_distance = self.get_distance()
  49.         mean_speed = training_distance / self.duration
  50.         return mean_speed
  51.  
  52.     def get_spent_calories(self) -> float:
  53.         """Получить количество затраченных калорий."""
  54.         pass
  55.  
  56.     def show_training_info(self) -> InfoMessage:
  57.         """Вернуть информационное сообщение о выполненной тренировке."""
  58.         return InfoMessage(
  59.             type(self).__name__,
  60.             self.duration,
  61.             self.get_distance(),
  62.             self.get_mean_speed(),
  63.             self.get_spent_calories()
  64.         )
  65.  
  66.  
  67. class Running(Training):
  68.     """Тренировка: бег."""
  69.     CALORIES_MEAN_SPEED_MULTIPLIER: int = 18
  70.     CALORIES_MEAN_SPEED_SHIFT: float = 1.79
  71.  
  72.     def __init__(self,
  73.                  action: int,
  74.                  duration: float,
  75.                  weight: float
  76.                  ) -> None:
  77.         super().__init__(action, duration, weight)
  78.  
  79.     def get_spent_calories(self) -> float:
  80.         mean_speed = super().get_mean_speed()
  81.         return (
  82.             ((((self.CALORIES_MEAN_SPEED_MULTIPLIER * mean_speed)
  83.               + self.CALORIES_MEAN_SPEED_SHIFT))
  84.              * self.weight / self.M_IN_KM * (self.duration * self.MIN_IN_H))
  85.         )
  86.  
  87.  
  88. class SportsWalking(Training):
  89.     """Тренировка: спортивная ходьба."""
  90.     CALORIES_WEIGHT_MULTIPLIER: float = 0.035
  91.     CALORIES_SPEED_HEIGHT_MULTIPLIER: float = 0.029
  92.     CM_IN_M: int = 100
  93.     POW_COEF: int = 2
  94.  
  95.     def __init__(self,
  96.                  action: int,
  97.                  duration: float,
  98.                  weight: float,
  99.                  height: float
  100.                  ) -> None:
  101.         super().__init__(action, duration, weight)
  102.         self.height = height
  103.  
  104.     def get_mean_speed(self) -> float:
  105.         """Получить среднюю скорость движения."""
  106.         mean_speed = super().get_mean_speed()
  107.         return mean_speed
  108.  
  109.     def get_spent_calories(self) -> float:
  110.         mean_speed = self.get_mean_speed() * self.KMH_IN_MSEC
  111.         training_time_in_minutes = self.duration * self.MIN_IN_H
  112.         height = self.height / self.CM_IN_M
  113.         return (
  114.             (
  115.                 self.CALORIES_WEIGHT_MULTIPLIER * self.weight
  116.                 + (
  117.                     mean_speed ** self.POW_COEF / height
  118.                 ) * self.CALORIES_SPEED_HEIGHT_MULTIPLIER * self.weight
  119.             ) * training_time_in_minutes
  120.         )
  121.  
  122.  
  123. class Swimming(Training):
  124.     """Тренировка: плавание."""
  125.     LEN_STEP: float = 1.38
  126.     SWIMMING_MEAN_SPEED_SHIFT: float = 1.1
  127.     SWIMMING_MEAN_SPEED_MULTIPLIER: int = 2
  128.  
  129.     def __init__(self,
  130.                  action: int,
  131.                  duration: float,
  132.                  weight: float,
  133.                  length_pool: int,
  134.                  count_pool: int
  135.                  ) -> None:
  136.         super().__init__(action, duration, weight)
  137.         self.length_pool = length_pool
  138.         self.count_pool = count_pool
  139.  
  140.     def get_mean_speed(self) -> float:
  141.         """Получить среднюю скорость движения."""
  142.         mean_speed = ((self.length_pool * self.count_pool)
  143.                       / self.M_IN_KM / self.duration)
  144.  
  145.         return mean_speed
  146.  
  147.     def get_spent_calories(self) -> float:
  148.         mean_speed = self.get_mean_speed()
  149.         return (((mean_speed + self.SWIMMING_MEAN_SPEED_SHIFT)
  150.                  * self.SWIMMING_MEAN_SPEED_MULTIPLIER)
  151.                 * self.weight * self.duration)
  152.  
  153.  
  154. def read_package(workout_type: str, data: list) -> Training:
  155.     """Прочитать данные полученные от датчиков."""
  156.     workout_codes = {
  157.         'SWM': Swimming,
  158.         'RUN': Running,
  159.         'WLK': SportsWalking
  160.     }
  161.     return workout_codes[workout_type](*data)
  162.  
  163.  
  164. def main(training: Training) -> None:
  165.     """Главная функция."""
  166.     info = training.show_training_info()
  167.     print(info.get_message())
  168.  
  169.  
  170. if __name__ == '__main__':
  171.     packages = [
  172.         ('SWM', [720, 1, 80, 25, 40]),
  173.         ('RUN', [15000, 1, 75]),
  174.         ('WLK', [9000, 1, 75, 180]),
  175.     ]
  176.  
  177.     for workout_type, data in packages:
  178.         training = read_package(workout_type, data)
  179.         main(training)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement