Генератор блоков из последовательности

Создайте один итератор и последовательно набирайте списки через islice. Последний неполный блок также возвращайте; размер должен быть положительным целым.

Короткий ответ

Что ответить на собеседовании

Создайте один итератор и последовательно набирайте списки через islice. Последний неполный блок также возвращайте; размер должен быть положительным целым.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать функцию‑генератор chunk_generator, принимающую два параметра:

  • iterable – любой итерируемый объект;
  • chunk_size – требуемый размер блока. Функция должна последовательно возвращать списки (чанки) указанного размера, сформированные из элементов переданного итерируемого объекта.
def chunk_generator(iterable, chunk_size):
    pass

Ответ

Создайте один итератор и последовательно набирайте списки через islice. Последний неполный блок также возвращайте; размер должен быть положительным целым.

from itertools import islice

def chunk_generator(iterable, chunk_size):
    if type(chunk_size) is not int or chunk_size <= 0:
        raise ValueError('Размер блока должен быть положительным целым')
    iterator = iter(iterable)
    while True:
        chunk = list(islice(iterator, chunk_size))
        if not chunk:
            return
        yield chunk

Для range(5) и размера 2 результат: [0, 1], [2, 3], [4]. Вход не обязан иметь длину или поддерживать срезы, поэтому решение работает и с генераторами. Проверка аргумента выполняется при первом продвижении генератора. Дополнительная память — O(chunk_size), полный обход — O(n).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее