Уровень 1. Базовые генераторы
- Поток номеров заказов
Интернет-магазин генерирует номера заказов.
Напишите генератор, который выдает:
ORD-000001
ORD-000002
ORD-000003
...
Требования
- Номера не должны храниться в списке.
- Генератор должен работать бесконечно.
Что отрабатывается
- yield
- бесконечные генераторы
⸻
- Лог-файл по строкам
Есть большой лог-файл:
INFO User login
ERROR Database timeout
INFO User logout
...
Напишите генератор, который читает файл построчно и возвращает строки по одной.
Дополнительно
С помощью второго генератора оставьте только строки с ERROR.
Что отрабатывается
- ленивое чтение файлов
- генераторы как конвейер обработки
⸻
- Таймер событий
Есть список событий:
events = [
("09:00", "meeting"),
("10:00", "call"),
("12:00", "lunch")
]
Создайте генератор, который возвращает события по одному.
Дополнительно
После последнего события генератор должен завершаться.
Что отрабатывается
- базовое использование итераторов
⸻
Уровень 2. Собственные итераторы
- История браузера
Реализуйте класс:
history = BrowserHistory([
"google.com",
"github.com",
"stackoverflow.com"
])
Чтобы работало:
for page in history:
print(page)
Требования
- использовать iter
- использовать next
Что отрабатывается
- протокол итератора
⸻
- Пагинация API
Представим API:
[
["user1", "user2"],
["user3", "user4"],
["user5"]
]
Каждый вложенный список — отдельная страница ответа.
Создайте итератор, который позволяет получить всех пользователей как единый поток:
for user in api_iterator:
print(user)
Что отрабатывается
- вложенные структуры
- состояние итератора
⸻
- Обход каталога
Есть структура:
[
"file1.txt",
"file2.txt",
"file3.txt"
]
Создайте класс-итератор, который возвращает файлы по одному.
Дополнение
Добавьте возможность начать обход с любого индекса.
⸻
Уровень 3. Генераторные конвейеры
- Анализ логов сервера
Файл содержит миллионы строк.
Необходимо построить конвейер:
Файл
↓
Только ERROR
↓
Только ошибки базы данных
↓
Подсчет количества
Ограничение
Нельзя загружать весь файл в память.
Что отрабатывается
- цепочки генераторов
- потоковая обработка данных
⸻
- Мониторинг датчиков
Датчик каждую секунду выдает температуру:
22.1
22.5
22.4
23.0
...
Создайте генератор.
Затем реализуйте второй генератор, который пропускает только значения выше:
23
Что отрабатывается
- генератор поверх генератора
⸻
- Онлайн-фильтрация транзакций
Поток транзакций:
{
"user": "Ivan",
"amount": 1500
}
Создайте конвейер:
Поток транзакций
↓
Только > 1000
↓
Только подозрительные
↓
Отправка в отчет
Что отрабатывается
- генераторные пайплайны
⸻
Уровень 4. Продвинутые генераторы
- Свой аналог range()
Реализуйте:
my_range(1, 10, 2)
Который работает как встроенный range.
Поддержать
- start
- stop
- step
- отрицательный шаг
Что отрабатывается
- логика генераторов
- граничные случаи
⸻
- Поток цен криптовалют
Генератор получает цены:
100
101
105
103
...
Необходимо выдавать изменение относительно предыдущей цены:
+1
+4
-2
...
Что отрабатывается
- хранение состояния внутри генератора
⸻
- Скользящее окно
Поток:
1, 2, 3, 4, 5, 6
Размер окна:
3
Результат:
(1,2,3)
(2,3,4)
(3,4,5)
(4,5,6)
Что отрабатывается
- очереди
- генераторы обработки потоков
⸻
Уровень 5. Генераторы как корутины
- Система уведомлений
Создайте генератор, который принимает данные через:
send()
Пример:
notifier.send("New order")
notifier.send("Payment received")
Генератор должен выводить уведомления.
Что отрабатывается
- send
- двусторонняя связь с генератором
⸻
- Обработка событий в чате
Есть поток сообщений:
"hello"
"/ban user1"
"how are you"
"/kick user2"
Через send() передавайте сообщения в генератор.
Генератор должен разделять:
- команды
- обычные сообщения
Что отрабатывается
- корутины
- маршрутизация данных
⸻
- Асинхронный брокер сообщений
Реализуйте мини-аналог Kafka/RabbitMQ.
Есть несколько подписчиков:
email_service
sms_service
audit_service
При поступлении события:
{"type": "payment"}
оно должно автоматически рассылаться всем подписчикам через генераторы.
Что отрабатывается
- генераторы как обработчики событий
- архитектурное применение
⸻
Уровень 6. Максимально приближено к реальной работе
- Анализатор огромного CSV-файла
Файл содержит 50 млн строк:
user_id,amount
1,100
2,500
...
Необходимо:
- Читать файл потоково.
- Отфильтровать покупки больше 1000.
- Посчитать сумму.
- Найти топ-10 пользователей.
Ограничение
Использование памяти должно быть практически постоянным.
Что отрабатывается
- генераторы в Data Engineering
⸻
- Мини поисковый движок
Есть тысячи текстовых файлов.
Реализуйте генератор:
search("python")
Который лениво возвращает найденные совпадения:
(file, line_number, text)
Что отрабатывается
- обход файлов
- потоковый поиск
⸻
- ETL-конвейер
Источник:
API -> Transform -> Validation -> Database
Каждый этап должен быть генератором.
Пример:
source()
↓
normalize()
↓
validate()
↓
save()
Что отрабатывается
- генераторы в промышленной обработке данных
- архитектурное мышление
⸻
Уровень 7. Задачи уровня собеседования Senior
- Реализовать itertools.groupby
Напишите собственную версию:
groupby(data, key=...)
которая работает лениво.
Что отрабатывается
- сложные итераторы
- контроль состояния
⸻
- Реализовать генератор графового обхода
Есть граф пользователей социальной сети.
Нужно реализовать:
dfs(graph, start)
и
bfs(graph, start)
через генераторы.
Ограничения
Узел возвращается только в момент посещения.
Что отрабатывается
- ленивый обход графов
- реальные алгоритмы
⸻
- Реализовать собственный аналог itertools.tee
Из одного генератора:
source = numbers()
получить:
a, b = tee(source)
чтобы оба итератора могли независимо читать данные.
Что отрабатывается
- буферизация
- сложные итераторы
- понимание внутреннего устройства генераторов