Ja, es ist immer noch ein Generator. Das return
ist (fast) gleichbedeutend mit Erhöhen StopIteration
.
PEP 255 beschreibt es:
Spezifikation: Rückgabe
Eine Generatorfunktion kann auch return-Anweisungen der folgenden Form enthalten:
"return"
Beachten Sie, dass eine Ausdrucksliste für return-Anweisungen im Hauptteil eines Generators nicht zulässig ist (obwohl sie natürlich in den Hauptteilen von Nicht-Generator-Funktionen erscheinen können, die im Generator verschachtelt sind).
Wenn eine return-Anweisung gefunden wird, fährt die Steuerung wie bei jeder Funktionsrückgabe fort und führt die entsprechenden finally-Klauseln aus (falls vorhanden). Dann wird eine StopIteration-Ausnahme ausgelöst, die signalisiert, dass der Iterator erschöpft ist. Eine StopIteration-Ausnahme wird auch ausgelöst, wenn die Steuerung ohne explizite Rückgabe vom Ende des Generators ausgeht.
Beachten Sie, dass return sowohl für Generatorfunktionen als auch für Nicht-Generatorfunktionen "Ich bin fertig und habe nichts Interessantes zurückzugeben" bedeutet.
Beachten Sie, dass return nicht immer gleichbedeutend mit dem Auslösen von StopIteration ist: Der Unterschied besteht darin, wie einschließende try / Except-Konstrukte behandelt werden. Zum Beispiel,
>>> def f1():
... try:
... return
... except:
... yield 1
>>> print list(f1())
[]
weil, wie in jeder Funktion, return einfach beendet wird, aber
>>> def f2():
... try:
... raise StopIteration
... except:
... yield 42
>>> print list(f2())
[42]
weil StopIteration wie jede Ausnahme von einem bloßen "außer" erfasst wird.
return
einen Streit hätte?