JustCaptain kod-buduschego
0c215d6bd3ad548a5cf5fee4d168ffd04adaac92
Перейти к файлу
Код
TASKS.md

Уровень 1. Базовые генераторы

  1. Поток номеров заказов

Интернет-магазин генерирует номера заказов.

Напишите генератор, который выдает:

ORD-000001
ORD-000002
ORD-000003
...

Требования

  • Номера не должны храниться в списке.
  • Генератор должен работать бесконечно.

Что отрабатывается

  • yield
  • бесконечные генераторы

⸻

  1. Лог-файл по строкам

Есть большой лог-файл:

INFO User login
ERROR Database timeout
INFO User logout
...

Напишите генератор, который читает файл построчно и возвращает строки по одной.

Дополнительно

С помощью второго генератора оставьте только строки с ERROR.

Что отрабатывается

  • ленивое чтение файлов
  • генераторы как конвейер обработки

⸻

  1. Таймер событий

Есть список событий:

events = [
("09:00", "meeting"),
("10:00", "call"),
("12:00", "lunch")
]

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

Дополнительно

После последнего события генератор должен завершаться.

Что отрабатывается

  • базовое использование итераторов

⸻

Уровень 2. Собственные итераторы

  1. История браузера

Реализуйте класс:

history = BrowserHistory([
"google.com",
"github.com",
"stackoverflow.com"
])

Чтобы работало:

for page in history:
print(page)

Требования

  • использовать iter
  • использовать next

Что отрабатывается

  • протокол итератора

⸻

  1. Пагинация API

Представим API:

[
["user1", "user2"],
["user3", "user4"],
["user5"]
]

Каждый вложенный список — отдельная страница ответа.

Создайте итератор, который позволяет получить всех пользователей как единый поток:

for user in api_iterator:
print(user)

Что отрабатывается

  • вложенные структуры
  • состояние итератора

⸻

  1. Обход каталога

Есть структура:

[
"file1.txt",
"file2.txt",
"file3.txt"
]

Создайте класс-итератор, который возвращает файлы по одному.

Дополнение

Добавьте возможность начать обход с любого индекса.

⸻

Уровень 3. Генераторные конвейеры

  1. Анализ логов сервера

Файл содержит миллионы строк.

Необходимо построить конвейер:

Файл
↓
Только ERROR
↓
Только ошибки базы данных
↓
Подсчет количества

Ограничение

Нельзя загружать весь файл в память.

Что отрабатывается

  • цепочки генераторов
  • потоковая обработка данных

⸻

  1. Мониторинг датчиков

Датчик каждую секунду выдает температуру:

22.1
22.5
22.4
23.0
...

Создайте генератор.

Затем реализуйте второй генератор, который пропускает только значения выше:

23

Что отрабатывается

  • генератор поверх генератора

⸻

  1. Онлайн-фильтрация транзакций

Поток транзакций:

{
"user": "Ivan",
"amount": 1500
}

Создайте конвейер:

Поток транзакций
↓
Только > 1000
↓
Только подозрительные
↓
Отправка в отчет

Что отрабатывается

  • генераторные пайплайны

⸻

Уровень 4. Продвинутые генераторы

  1. Свой аналог range()

Реализуйте:

my_range(1, 10, 2)

Который работает как встроенный range.

Поддержать

  • start
  • stop
  • step
  • отрицательный шаг

Что отрабатывается

  • логика генераторов
  • граничные случаи

⸻

  1. Поток цен криптовалют

Генератор получает цены:

100
101
105
103
...

Необходимо выдавать изменение относительно предыдущей цены:

+1
+4
-2
...

Что отрабатывается

  • хранение состояния внутри генератора

⸻

  1. Скользящее окно

Поток:

1, 2, 3, 4, 5, 6

Размер окна:

3

Результат:

(1,2,3)
(2,3,4)
(3,4,5)
(4,5,6)

Что отрабатывается

  • очереди
  • генераторы обработки потоков

⸻

Уровень 5. Генераторы как корутины

  1. Система уведомлений

Создайте генератор, который принимает данные через:

send()

Пример:

notifier.send("New order")
notifier.send("Payment received")

Генератор должен выводить уведомления.

Что отрабатывается

  • send
  • двусторонняя связь с генератором

⸻

  1. Обработка событий в чате

Есть поток сообщений:

"hello"
"/ban user1"
"how are you"
"/kick user2"

Через send() передавайте сообщения в генератор.

Генератор должен разделять:

  • команды
  • обычные сообщения

Что отрабатывается

  • корутины
  • маршрутизация данных

⸻

  1. Асинхронный брокер сообщений

Реализуйте мини-аналог Kafka/RabbitMQ.

Есть несколько подписчиков:

email_service
sms_service
audit_service

При поступлении события:

{"type": "payment"}

оно должно автоматически рассылаться всем подписчикам через генераторы.

Что отрабатывается

  • генераторы как обработчики событий
  • архитектурное применение

⸻

Уровень 6. Максимально приближено к реальной работе

  1. Анализатор огромного CSV-файла

Файл содержит 50 млн строк:

user_id,amount
1,100
2,500
...

Необходимо:

  1. Читать файл потоково.
  2. Отфильтровать покупки больше 1000.
  3. Посчитать сумму.
  4. Найти топ-10 пользователей.

Ограничение

Использование памяти должно быть практически постоянным.

Что отрабатывается

  • генераторы в Data Engineering

⸻

  1. Мини поисковый движок

Есть тысячи текстовых файлов.

Реализуйте генератор:

search("python")

Который лениво возвращает найденные совпадения:

(file, line_number, text)

Что отрабатывается

  • обход файлов
  • потоковый поиск

⸻

  1. ETL-конвейер

Источник:

API -> Transform -> Validation -> Database

Каждый этап должен быть генератором.

Пример:

source()
↓
normalize()
↓
validate()
↓
save()

Что отрабатывается

  • генераторы в промышленной обработке данных
  • архитектурное мышление

⸻

Уровень 7. Задачи уровня собеседования Senior

  1. Реализовать itertools.groupby

Напишите собственную версию:

groupby(data, key=...)

которая работает лениво.

Что отрабатывается

  • сложные итераторы
  • контроль состояния

⸻

  1. Реализовать генератор графового обхода

Есть граф пользователей социальной сети.

Нужно реализовать:

dfs(graph, start)

и

bfs(graph, start)

через генераторы.

Ограничения

Узел возвращается только в момент посещения.

Что отрабатывается

  • ленивый обход графов
  • реальные алгоритмы

⸻

  1. Реализовать собственный аналог itertools.tee

Из одного генератора:

source = numbers()

получить:

a, b = tee(source)

чтобы оба итератора могли независимо читать данные.

Что отрабатывается

  • буферизация
  • сложные итераторы
  • понимание внутреннего устройства генераторов