Почему в примере функция завершается:
def func(iterable):
while True:
val = next(iterable)
yield val
но если я снимаю функцию оператора yield, вы вызовете исключение StopIteration?
РЕДАКТИРОВАТЬ: Извините за то, что вы обманываете вас, ребята. Я знаю, что такое генераторы и как их использовать. Конечно, когда я сказал, что функция прекращается, я не имел в виду нетерпеливую оценку функции. Я просто подразумевал, что когда я использую функцию для генерации генератора:
gen = func(iterable)
в случае func он работает и возвращает тот же самый генератор, но в случае func2:
def func2(iterable):
while True:
val = next(iterable)
он вызывает StopIteration вместо None return или бесконечного цикла.
Позвольте мне быть более конкретным. В itertools есть функция tee, которая эквивалентна:
def tee(iterable, n=2):
it = iter(iterable)
deques = [collections.deque() for i in range(n)]
def gen(mydeque):
while True:
if not mydeque: # when the local deque is empty
newval = next(it) # fetch a new value and
for d in deques: # load it to all the deques
d.append(newval)
yield mydeque.popleft()
return tuple(gen(d) for d in deques)
Существует, по сути, некоторая магия, потому что вложенная функция gen имеет бесконечный цикл без операторов break. Функция gen прекращается из-за исключения StopIteration, когда в нем нет элементов. Но он заканчивается корректно (без привлечения исключений), т.е. Просто останавливает цикл. Итак, вопрос: где обрабатывается StopIteration?