Функция chunks() с yield, при вызове list(chunks())
Есть список. При попытке преобразовать его в один список с вложенными списками по n-элементов, метод next(chuks()) -два раза возвращает первых n элементов , а вот когда мы используем list(chunks()) возвращается правильный результат (список с вложенными списками по 10 элементов ) Почему вызов функции с yield через list() возвращает полный список , а не первые 10 элементов? Я не могу дойти самостоятельно до этого ... Как именно формируется список в конце, при вызове list(chunks(list_int, 10)) ?
list_int= [i for i in range (0, 100 ,2)]
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
next(chunks(list_int, 10))
next(chunks(list_int, 10)) #второй вызов возвращает тот же результат
list(chunks(list_int, 10)) # возвращает правильный результат / [[0, 2, 4, 6, 8, 10, 12, 14, 16, 18], [20, 22, 24, 26, 28, 30, 32, 34, 36, 38], [40, 42, 44, 46, 48, 50, 52, 54, 56, 58], [60, 62, 64, 66, 68, 70, 72, 74, 76, 78], [80, 82, 84, 86, 88, 90, 92, 94, 96, 98]]
Ответы (1 шт):
в документации сказано, что конструктор list принимает аргумент поддерживающий итерацию или объект итератор, отсюда и получается нужный вам результат.
примерно то же самое как:
list_int = [i for i in range (0, 100 ,2)]
n = 10
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
chunk = chunks(list_int, n)
res = [next(chunk) for _ in range(len(list_int)//n)]
# или так res = [i for i in chunk]
вывод:
[[0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
[20, 22, 24, 26, 28, 30, 32, 34, 36, 38],
[40, 42, 44, 46, 48, 50, 52, 54, 56, 58],
[60, 62, 64, 66, 68, 70, 72, 74, 76, 78],
[80, 82, 84, 86, 88, 90, 92, 94, 96, 98]]