Рассмотрите следующий интерактивный пример
>>> l=imap(str,xrange(1,4))
>>> list(l)
['1', '2', '3']
>>> list(l)
[]
Кто-нибудь знает, существует ли где-то уже реализация с версией imap (и другими функциями itertools), например что второй раз список (l) выполняется, вы получаете то же самое, что и первый. И мне не нужна обычная карта, потому что создание всего вывода в памяти может быть пустой тратой памяти, если вы используете большие диапазоны.
Я хочу что-то, что в основном делает что-то вроде
class cmap:
def __init__(self, function, *iterators):
self._function = function
self._iterators = iterators
def __iter__(self):
return itertools.imap(self._function, *self._iterators)
def __len__(self):
return min( map(len, self._iterators) )
Но было бы пустой тратой времени делать это вручную для всех itertools, если кто-то уже это сделал.
ps. Считаете ли вы, что контейнеры более дзен, чем итераторы, поскольку для итератора нечто вроде
for i in iterator:
do something
неявно очищает итератор, в то время как контейнер вам явно необходимо удалить элементы.