Ответ 1
Да, это еще генератор. return
(почти) эквивалентно повышению StopIteration
.
PEP 255 говорит:
Спецификация: Return
Функция генератора также может содержать операторы возврата вида:
"return"
Обратите внимание, что выражение expression_list не разрешено в операторах return в тело генератора (хотя, конечно, они могут появляться в тела негенераторных функций, вложенных в генератор).
Когда встречается оператор return, управление продолжается как в любом возвращает функцию, выполняя соответствующие окончательные предложения (если есть существовать). Затем возникает исключение StopIteration, сигнализирующее, что итератор исчерпан. Исключение StopIteration также возникает, если управление течет от конца генератора без эксплицитного возврата.
Обратите внимание, что возврат означает "Я закончил, и у меня нет ничего интересного return", как для функций генератора, так и для негенераторных функций.
Обратите внимание, что возврат не всегда эквивалентен повышению StopIteration: разница заключается в том, как заключать объекты try/except обрабатывали. Например,
>>> def f1(): ... try: ... return ... except: ... yield 1 >>> print list(f1()) []
потому что, как и в любой функции, возврат просто завершается, но
>>> def f2(): ... try: ... raise StopIteration ... except: ... yield 42 >>> print list(f2()) [42]
потому что StopIteration захватывается голой "исключением", как и любая исключение.