На этом шаге мы рассмотрим использование функции itertools.islice().
Вы хотите получить срез данных, производимых итератором, но обычный оператор среза не работает.
Функция itertools.islice() отлично подходит для получения срезов генераторов и итераторов. Например:
>>> def count(n): while True: yield n n += 1 >>> c = count(0) >>> c[10:20] Traceback (most recent call last): . . . . c[10:20] TypeError: 'generator' object is not subscriptable >>> # Теперь используем islice() >>> import itertools >>> for x in itertools.islice(c, 10, 20): print(x) 10 11 12 13 14 15 16 17 18 19 >>>
Из итераторов и генераторов получить срез напрямую нельзя, потому что отсутствует информация об их длине (и в них не реализовано индексирование). Результат islice() - это итератор, который создает элементы нужного среза, но делает это путем потребления и выбрасывания всех элементов до стартового индекса среза. Следующие элементы затем производятся объектом islice, пока не будет достигнут конечный индекс среза.
Важно отметить, что islice() будет потреблять данные, предоставляемые итератором. Это важно, поскольку итераторы не могут быть отмотаны назад. Если вам нужно возвращаться назад, то вам, наверное, лучше сначала конвертировать данные в список.
На следующем шаге мы рассмотрим пропуск первой части итерируемого объекта.