🏠 Домашнее задание

⚡ Суть задания

Четыре задачи на закрепление декораторов и классов: измерение времени выполнения с повторами, декоратор с параметром, класс Rectangle и класс Counter.

Результат: четыре рабочих скрипта, которые можно запустить в VS Code.

📋 Задание 1. Среднее время выполнения

Исходное задание из LMS:

Создайте декоратор measure_time, который измеряет и выводит среднее время выполнения функции за 5 вызовов. Функция может быть любой: например, сортировка списка, чтение из файла или расчёты.

Пример применения:

@measure_time
def compute():
    total = 0
    for i in range(10_000_000):
        total += i
    return total

Пример вывода:

Среднее время выполнения для 5 вызовов: 0.21 секунд
Результат: 49999995000000

✅ Полное решение

import time


def measure_time(func):
    def wrapper(*args, **kwargs):
        repeats = 5
        total_time = 0
        for _ in range(repeats):
            start = time.time()
            result = func(*args, **kwargs)
            total_time += time.time() - start
        average = total_time / repeats
        print(f"Среднее время выполнения для {repeats} вызовов: {average:.2f} секунд")
        return result
    return wrapper


@measure_time
def compute():
    total = 0
    for i in range(10_000_000):
        total += i
    return total


print("Результат:", compute())

📋 Задание 2. Среднее время выполнения с количеством вызовов

Исходное задание из LMS:

Доработайте декоратор measure_time, чтобы он принимал параметр repeats — количество вызовов функции. Декоратор должен выполнять функцию указанное число раз и выводить среднее время выполнения.

Пример применения:

@measure_time(10)
def compute():
    total = 0
    for i in range(10_000_000):
        total += i
    return total

Пример вывода:

Среднее время выполнения для 10 вызовов: 0.21 секунд
Результат: 49999995000000

✅ Полное решение

import time


def measure_time(repeats):
    def decorator(func):
        def wrapper(*args, **kwargs):
            total_time = 0
            for _ in range(repeats):
                start = time.time()
                result = func(*args, **kwargs)
                total_time += time.time() - start
            average = total_time / repeats
            print(f"Среднее время выполнения для {repeats} вызовов: {average:.2f} секунд")
            return result
        return wrapper
    return decorator


@measure_time(10)
def compute():
    total = 0
    for i in range(10_000_000):
        total += i
    return total


print("Результат:", compute())

📋 Задание 3. Класс Rectangle

Исходное задание из LMS:

Создайте класс Rectangle, который описывает прямоугольник.

  • У каждого объекта должны быть два поля: width и height.
  • Добавьте метод get_area(), который возвращает площадь прямоугольника.
  • Создайте объект прямоугольника с произвольными значениями.
  • Выведите его площадь.
  • Измените ширину и высоту.
  • Выведите новую площадь.

Пример вывода:

Площадь: 20
Новая площадь: 35

✅ Полное решение

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def get_area(self):
        return self.width * self.height


rectangle = Rectangle(4, 5)
print(f"Площадь: {rectangle.get_area()}")
rectangle.width = 5
rectangle.height = 7
print(f"Новая площадь: {rectangle.get_area()}")

📋 Задание 4. Класс Counter

Исходное задание из LMS:

Реализуйте класс Counter, который представляет собой простой счётчик.

  • Счётчик должен начинаться с нуля.
  • Предусмотрите методы для увеличения и уменьшения значения на единицу, при этом при каждой операции должно отображаться новое значение счётчика.
  • Добавьте метод, возвращающий текущий результат.
  • Проверьте работу счётчика, выполнив несколько операций.

Пример вывода:

Значение увеличено, текущее: 1
Значение увеличено, текущее: 2
Значение увеличено, текущее: 3
Значение уменьшено, текущее: 2
Текущее значение: 2

✅ Полное решение

class Counter:
    def __init__(self):
        self.value = 0

    def increment(self):
        self.value += 1
        print(f"Значение увеличено, текущее: {self.value}")

    def decrement(self):
        self.value -= 1
        print(f"Значение уменьшено, текущее: {self.value}")

    def get_value(self):
        return self.value


counter = Counter()
counter.increment()
counter.increment()
counter.increment()
counter.decrement()
print(f"Текущее значение: {counter.get_value()}")

🔧 Подготовка окружения

  1. Создайте папку python-fundamentals-practice/lesson-67/.
  2. Создайте файлы homework_01_measure.py, homework_02_measure_param.py, homework_03_rectangle.py и homework_04_counter.py.
  3. Скопируйте в каждый файл соответствующее полное решение.

🧪 Как проверить решение

  1. Активируйте venv: venv\Scripts\activate (Windows) или source venv/bin/activate (Mac/Linux).
  2. Запустите скрипты:
    • python homework_01_measure.py
    • python homework_02_measure_param.py
    • python homework_03_rectangle.py
    • python homework_04_counter.py
  3. Убедитесь, что вывод совпадает с примерами из заданий.

💡 Советы и типичные ошибки

  • В заданиях 1 и 2 не забудьте вернуть результат из обёртки, иначе функция будет возвращать None.
  • В задании 2 декоратор measure_time(repeats) — фабрика, она должна вернуть декоратор.
  • В задании 3 площадь считается как width * height.
  • В задании 4 начальное значение счётчика задаётся в __init__.