Контекст
Лента городской барахолки подгружается по мере прокрутки: пользователь видит первую страницу мгновенно, а остальные приложение запрашивает, только если он действительно листает дальше. Резать заранее весь список объявлений — лишняя работа: до третьей страницы доходит один пользователь из двадцати. Генератор подходит идеально: страница нарезается ровно в тот момент, когда её запросили.
Задача
Реализуйте генератор paginate_feed(items, per_page): items — список заголовков объявлений, per_page — положительный размер страницы.
Правила
- Выдавайте через
yieldсписки-страницы: первыеper_pageэлементов, следующиеper_pageи так далее, порядок объявлений сохраняется. - Если длина
itemsне делится наper_pageнацело, последняя страница короче — выдаётся как есть. - Пустой
itemsне выдаёт ни одной страницы:list(...)даёт[]. - Входной список не мутируется: каждая страница — новый список.
- Результат вызова — генератор: очередная страница строится только по запросу.
Примеры
feed = ["Лыжи детские", "Самокат", "Гитара", "Палатка", "Велокресло"]
list(paginate_feed(feed, 2))
# [['Лыжи детские', 'Самокат'], ['Гитара', 'Палатка'], ['Велокресло']]
list(paginate_feed(feed, 3))
# [['Лыжи детские', 'Самокат', 'Гитара'], ['Палатка', 'Велокресло']]
list(paginate_feed([], 3))
# []
Где это пригодится
Нарезка потока на порции — рабочая лошадка бэкенда: страницы выдачи, батчи для записи в базу, чанки для отправки по сети. Генератор делает её ленивой — удобно, когда порций много, а потребитель может остановиться на первой.