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

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

Пять задач на закрепление регулярных выражений и замыканий: извлечение дат, разделение тегов, фабрика округления, логгер событий и декоратор рамки.

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

📋 Задание 1. Извлечение дат

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

Реализуйте программу, которая находит в тексте все даты в форматах DD/MM/YYYY, DD-MM-YYYY и DD.MM.YYYY.

Данные:

text = "The events N 123456 happened on 15/03/2025, 01.12.2024 and 09-09-2023. Deadline: 28/02/2022."

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

15/03/2025
01.12.2024
09-09-2023
28/02/2022

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

import re


def extract_dates(text: str) -> list[str]:
    pattern = r"\b\d{2}[/.-]\d{2}[/.-]\d{4}\b"
    return re.findall(pattern, text)


text = "The events N 123456 happened on 15/03/2025, 01.12.2024 and 09-09-2023. Deadline: 28/02/2022."
for date in extract_dates(text):
    print(date)

📋 Задание 2. Разделение списка тегов

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

Реализуйте программу, которая читает строку с тегами, введёнными пользователем, разделяет её на отдельные теги независимо от разделителя (запятые, точки с запятой, слэши или пробелы), удаляет лишние пробелы и пустые значения.

Данные:

tag_input = "python, data-science / machine-learning; AI  neural-networks"

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

['python', 'data-science', 'machine-learning', 'AI', 'neural-networks']

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

import re


def parse_tags(tag_input: str) -> list[str]:
    raw_tags = re.split(r"[,;/\s]+", tag_input)
    return [tag.strip() for tag in raw_tags if tag.strip()]


tag_input = "python, data-science / machine-learning; AI  neural-networks"
print(parse_tags(tag_input))

📋 Задание 3. Фабрика функций округления

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

Создайте функцию make_rounder(), которая принимает количество знаков для округления и возвращает другую функцию. Полученная функция должна принимать число и возвращать его, округлённое до указанного ранее количества знаков после запятой.

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

print(round2(3.14159))
print(round2(2.71828))
print(round0(9.999))

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

3.14
2.72
10.0

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

def make_rounder(precision: int):
    def round_number(value: float) -> float:
        return round(value, precision)
    return round_number


round2 = make_rounder(2)
round0 = make_rounder(0)

print(round2(3.14159))  # 3.14
print(round2(2.71828))  # 2.72
print(round0(9.999))    # 10.0

📋 Задание 4. Расширяемый логгер событий

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

Создайте функцию, которая возвращает вложенный логгер событий. Каждый вызов логгера должен сохранять событие с текущим временем и возвращать весь список событий.

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

log("Загрузка данных")
log("Обработка завершена")
log("Сохранение файла")
for event in log():
    print(event)

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

Загрузка данных: 2025-03-24 14:06:29
Обработка завершена: 2025-03-24 14:06:29
Сохранение файла: 2025-03-24 14:06:29

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

from datetime import datetime


def make_event_logger():
    events: list[str] = []

    def log(message: str | None = None) -> list[str]:
        if message is not None:
            timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            events.append(f"{message}: {timestamp}")
        return events

    return log


log = make_event_logger()
log("Загрузка данных")
log("Обработка завершена")
log("Сохранение файла")

for event in log():
    print(event)

📋 Задание 5. Рамка вокруг вывода

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

Создайте декоратор frame, который оборачивает результат функции рамкой из 50 символов -, выводя по строке до и после вызова функции.

Пример декорируемой функции:

@frame
def say_hello():
    print("Привет, игрок!")

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

--------------------------------------------------
Привет, игрок!
--------------------------------------------------

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

def frame(func):
    border = "-" * 50

    def wrapper() -> None:
        print(border)
        func()
        print(border)

    return wrapper


@frame
def say_hello():
    print("Привет, игрок!")


say_hello()

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

  1. Создайте папку python-fundamentals-practice/lesson-63/.
  2. Создайте файлы homework_01_dates.py, homework_02_tags.py, homework_03_rounder.py, homework_04_logger.py и homework_05_frame.py.
  3. Скопируйте в каждый файл соответствующее полное решение.

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

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

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

  • В задании 1 символы [/.-] внутри класса не все нужно экранировать, но экранирование дефиса в конце делает шаблон надёжнее.
  • В задании 2 re.split с шаблоном [,;/\s]+ разделяет по любому из перечисленных разделителей.
  • В задании 4 список events должен быть в замыкании, а не в глобальной переменной или значением по умолчанию.
  • В задании 5 рамка печатается в декораторе, а не возвращается строкой.