Так, це все ще генератор. Це return
(майже) еквівалентно підвищенню StopIteration
.
PEP 255 пише:
Специфікація: Повернення
Функція генератора може також містити оператори повернення у вигляді:
"return"
Зверніть увагу, що перелік_виразів заборонений для операторів return у тілі генератора (хоча, звичайно, вони можуть з'являтися в тілах негенераторних функцій, вкладених у генератор).
Коли зустрічається оператор return, керування виконується, як і у будь-якій функції повернення, виконуючи відповідні пункти final (якщо такі існують). Потім піднімається виняток StopIteration, що сигналізує про те, що ітератор вичерпано. Виняток StopIteration також застосовується, якщо керування стікає з кінця генератора без повернення експлікта.
Зверніть увагу, що return означає "я закінчив і не маю чого цікавого повернути" як для генераторських функцій, так і для негенераторних функцій.
Зверніть увагу, що повернення не завжди еквівалентно підвищенню StopIteration: різниця полягає в тому, як обробляються конструкції, що включають try / Osim. Наприклад,
>>> def f1():
... try:
... return
... except:
... yield 1
>>> print list(f1())
[]
тому що, як і в будь-якій функції, return просто виходить, але
>>> def f2():
... try:
... raise StopIteration
... except:
... yield 42
>>> print list(f2())
[42]
тому що StopIteration фіксується голим "за винятком", як і будь-який виняток.
return
сварилися?