Вы нарушаете определение генератора, который должен генерировать исключение StopIteration, когда итерация завершена (которая автоматически обрабатывается оператором возврата в функции генератора)
Итак:
def iterate(i):
for value in i:
yield value
return
Лучше всего, чтобы вызывающий код обрабатывал случай пустого итератора:
count = 0
for value in iterate(range([])):
print value
count += 1
else:
if count == 0:
print "list was empty"
Может быть, это более чистый способ выполнения вышеприведенного, но он должен работать нормально и не попадать ни в одну из распространенных ловушек, описывающих итератор как список.