Практические задачи: Генераторы и итераторы в Python
Задачи расположены по возрастанию сложности.
Правило:
- сначала попытаться решить самому
- только потом смотреть подсказки
- сначала сделать через цикл
- потом попробовать через yield
⸻
⸻
Задача 4. Космический телеметрический поток
Предметная область
Космический спутник отправляет температуру двигателя.
Данные идут постоянно.
Нельзя хранить всё в памяти.
⸻
Условие
Создайте генератор температур.
Например:
42
44
43
45
41
Можно сделать список внутри.
Но выдавать значения нужно через yield.
⸻
Пример:
for temp in telemetry():
print(temp)
⸻
Что тренируется
- потоковая обработка данных
- реальный use case генераторов
⸻
Усложнение
Если температура больше 80:
вывести предупреждение.
⸻
Задача 5. Netflix: сериал по сериям
Предметная область
Сервис видео не загружает весь сериал сразу.
Серии подгружаются постепенно.
⸻
Условие
Создайте генератор:
episodes()
Данные:
Серия 1
Серия 2
Серия 3
Пример:
show = episodes()
print(next(show))
print(next(show))
⸻
После окончания должен возникнуть:
StopIteration
⸻
Что тренируется
- одноразовость генератора
- next()
⸻
Задача 6. Генератор паролей
Предметная область
Система безопасности перебирает возможные PIN-коды.
Она не хранит миллионы комбинаций.
Она создаёт их по мере необходимости.
⸻
Условие
Сделайте генератор PIN-кодов:
0000
0001
0002
0003
...
9999
⸻
Пример:
pins = pin*generator()
for * in range(10):
print(next(pins))
Результат:
0000
0001
0002
...
0009
⸻
Что тренируется
- генераторы для больших объёмов
- ленивые вычисления
⸻
Почему это реальный кейс
Так работают brute-force алгоритмы.
Они не создают список:
["0000", "0001", ..., "9999"]
Они генерируют комбинации по одной.
⸻
Задача 7. Свой iterator
Предметная область
Робот доставщик проходит точки маршрута.
Маршрут:
Склад
Улица
Подъезд
Квартира
⸻
Условие
Создайте собственный iterator через класс.
Используйте:
iter()
next()
Пример:
route = DeliveryRoute()
for point in route:
print(point)
⸻
Что тренируется
- устройство iterator изнутри
- StopIteration
- хранение состояния
⸻
Задача 8. Логи сервера (реальная backend-задача)
Предметная область
Сервер генерирует миллионы строк логов.
Нельзя:
readlines()
Это может съесть память.
Нужно читать строку за строкой.
⸻
Условие
Есть файл:
logs.txt
Напишите генератор:
read_logs(filename)
Он должен читать файл построчно через yield.
Пример:
for line in read_logs("logs.txt"):
print(line)
⸻
Что тренируется
- реальный production-case
- работа с памятью
- сильная сторона генераторов
⸻
Задача 9. Бесконечный счётчик опыта персонажа
Предметная область
RPG-игра.
Персонаж получает опыт:
10
20
30
40
50
...
⸻
Условие
Создайте бесконечный генератор опыта.
Каждый следующий уровень:
+10 XP
Пример:
xp = experience*generator()
for * in range(5):
print(next(xp))
Результат:
10
20
30
40
50
⸻
Задача 10. Фильтр подозрительных транзакций
Предметная область
Банк анализирует платежи.
Есть поток платежей:
[100, 250, 10000, 50, 7000]
Подозрительными считаются:
больше 5000
⸻
Условие
Напишите генератор, который возвращает только подозрительные платежи.
Результат:
10000
7000
⸻
Что тренируется
- генераторы как фильтр
- потоковая обработка данных
- практический data engineering case
⸻
Challenge-задача
Сделайте генератор Fibonacci.
Последовательность:
1
1
2
3
5
8
13
21
...
Требование:
генератор должен быть бесконечным.
Рекомендую порядок решения:
1 → 2 → 3 → 5 → 9 → 10 → 7 → 8 → Challenge
Так сложность растёт плавно.