РЕДАКТИРОВАТЬ 3: Ответ @hynekcer намного лучше, чем этот.
РЕДАКТИРОВАТЬ 2: Это не будет работать, если у вас бесконечный итератор или тот, который использует слишком много гигабайт (в 2010 году 1 гигабайт по-прежнему остается большим объемом оперативной памяти / диска пространство) оперативной памяти / дискового пространства.
Вы уже видели хороший ответ, но вот дорогой хак, который вы можете использовать, если хотите съесть пирог и иметь его тоже :) Хитрость в том, что мы должны клонировать пирог, и когда вы закончите поедая, мы кладем его обратно в ту же коробку. Помните, что когда вы перебираете итератор, он обычно становится пустым или, по крайней мере, теряет ранее возвращенные значения.
>>> def getIterLength(iterator):
temp = list(iterator)
result = len(temp)
iterator = iter(temp)
return result
>>>
>>> f = xrange(20)
>>> f
xrange(20)
>>>
>>> x = getIterLength(f)
>>> x
20
>>> f
xrange(20)
>>>
РЕДАКТИРОВАТЬ: Вот более безопасная версия, но ее использование все еще требует некоторой дисциплины. Это не чувствует себя достаточно Pythonic. Вы получите лучшее решение, если разместите весь соответствующий пример кода, который вы пытаетесь реализовать.
>>> def getIterLenAndIter(iterator):
temp = list(iterator)
return len(temp), iter(temp)
>>> f = iter([1,2,3,7,8,9])
>>> f
<listiterator object at 0x02782890>
>>> l, f = getIterLenAndIter(f)
>>>
>>> l
6
>>> f
<listiterator object at 0x02782610>
>>>