Создайте один итератор и последовательно набирайте списки через 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).