Я встречал этот код из Самый питонический способ подсчета совпадающих элементов в чем-то итерируемом
r = xrange(1, 10)
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 3
r повторяется один раз. а потом снова повторяется. Я думал, что если итератор один раз используется, то все кончено, и его не следует повторять снова.
Выражения генератора могут повторяться только один раз:
r = (7 * i for i in xrange(1, 10))
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 0
enumerate(L) тоже:
r = enumerate(mylist)
и файловый объект тоже:
f = open(myfilename, 'r')
Почему xrange ведет себя иначе?