python solution.py

Пагинация ленты через генератор Python

Выдавайте страницы ленты по запросу, включая последнюю неполную страницу.

  • ЯзыкPython
  • УровеньСредний
  • НавыкГенераторы, yield и нарезка списка

Контекст

Лента городской барахолки подгружается по мере прокрутки: пользователь видит первую страницу мгновенно, а остальные приложение запрашивает, только если он действительно листает дальше. Резать заранее весь список объявлений — лишняя работа: до третьей страницы доходит один пользователь из двадцати. Генератор подходит идеально: страница нарезается ровно в тот момент, когда её запросили.

Задача

Реализуйте генератор paginate_feed(items, per_page): items — список заголовков объявлений, per_page — положительный размер страницы.

Правила

  1. Выдавайте через yield списки-страницы: первые per_page элементов, следующие per_page и так далее, порядок объявлений сохраняется.
  2. Если длина items не делится на per_page нацело, последняя страница короче — выдаётся как есть.
  3. Пустой items не выдаёт ни одной страницы: list(...) даёт [].
  4. Входной список не мутируется: каждая страница — новый список.
  5. Результат вызова — генератор: очередная страница строится только по запросу.

Примеры

feed = ["Лыжи детские", "Самокат", "Гитара", "Палатка", "Велокресло"]

list(paginate_feed(feed, 2))
# [['Лыжи детские', 'Самокат'], ['Гитара', 'Палатка'], ['Велокресло']]

list(paginate_feed(feed, 3))
# [['Лыжи детские', 'Самокат', 'Гитара'], ['Палатка', 'Велокресло']]

list(paginate_feed([], 3))
# []

Где это пригодится

Нарезка потока на порции — рабочая лошадка бэкенда: страницы выдачи, батчи для записи в базу, чанки для отправки по сети. Генератор делает её ленивой — удобно, когда порций много, а потребитель может остановиться на первой.

Двигайтесь по одному шагу

Подсказка 1

Перемещайтесь по списку с шагом per_page.

Подсказка 2

Каждый раз выдавайте новый срез, а не один изменяемый список.

Подсказка 3

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

Как выдавать данные порциями

Генератор строит очередную страницу только при следующей итерации, а срез помогает сохранить короткий хвост.

Не оставляйте задачу изолированной