В любое время, когда вам нужен итератор. Вот для чего iter
, он возвращает итератор для того, что вы ему передаете. Итак, рассмотрим следующий генератор, который использует преимущества свойств итератора, а именно: он однопроходный и исчерпываемый , и извлечение итератора из итератора должно возвращать сам итератор вместо того, чтобы давать вам новый.
In [19]: import itertools
In [20]: def chunk_by_n(iterable, n):
...: islice = itertools.islice
...: iterator = iter(iterable)
...: chunk = list(islice(iterator, n))
...: while chunk:
...: yield chunk
...: chunk = list(islice(iterator, n))
...:
In [21]: iterable = range(100)
In [22]: chunks = chunk_by_n(iterable, 3)
In [23]: next(chunks)
Out[23]: [0, 1, 2]
In [24]: next(chunks)
Out[24]: [3, 4, 5]
In [25]: next(chunks)
Out[25]: [6, 7, 8]
Теперь посмотрите, что произойдет, если мы не сделаем итератор из ввода:
In [26]: def chunk_by_n(iterable, n):
...: islice = itertools.islice
...: #iterator = iter(iterable)
...: iterator = iterable
...: chunk = list(islice(iterator, n))
...: while chunk:
...: yield chunk
...: chunk = list(islice(iterator, n))
...:
In [27]: chunks = chunk_by_n(iterable, 3)
In [28]: next(chunks)
Out[28]: [0, 1, 2]
In [29]: next(chunks)
Out[29]: [0, 1, 2]
In [30]: next(chunks)
Out[30]: [0, 1, 2]