📋 Задание 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()
🔧 Подготовка окружения
- Создайте папку
python-fundamentals-practice/lesson-63/. - Создайте файлы
homework_01_dates.py,homework_02_tags.py,homework_03_rounder.py,homework_04_logger.pyиhomework_05_frame.py. - Скопируйте в каждый файл соответствующее полное решение.
🧪 Как проверить решение
- Активируйте venv:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите скрипты:
python homework_01_dates.pypython homework_02_tags.pypython homework_03_rounder.pypython homework_04_logger.pypython homework_05_frame.py
- Убедитесь, что вывод совпадает с примерами из заданий.
💡 Советы и типичные ошибки
- В задании 1 символы
[/.-]внутри класса не все нужно экранировать, но экранирование дефиса в конце делает шаблон надёжнее. - В задании 2
re.splitс шаблоном[,;/\s]+разделяет по любому из перечисленных разделителей. - В задании 4 список
eventsдолжен быть в замыкании, а не в глобальной переменной или значением по умолчанию. - В задании 5 рамка печатается в декораторе, а не возвращается строкой.