Sie können return
einmal in einem Generator verwenden; Es stoppt die Iteration, ohne etwas zu ergeben, und bietet somit eine explizite Alternative dazu, dass die Funktion keinen Gültigkeitsbereich mehr hat. Verwenden Sie also yield
, um die Funktion in einen Generator umzuwandeln, aber gehen Sie voran, return
um den Generator zu beenden, bevor Sie etwas liefern.
>>> def f():
... return
... yield
...
>>> list(f())
[]
Ich bin mir nicht sicher, ob es so viel besser ist als das, was Sie haben - es ersetzt nur eine No-Op- if
Anweisung durch eine No-Op- yield
Anweisung. Aber es ist idiomatischer. Beachten Sie, dass nur die Verwendung yield
nicht funktioniert.
>>> def f():
... yield
...
>>> list(f())
[None]
Warum nicht einfach benutzen iter(())
?
Diese Frage bezieht sich speziell auf eine leere Generatorfunktion . Aus diesem Grund verstehe ich es eher als eine Frage zur internen Konsistenz der Python-Syntax als als eine Frage nach dem besten Weg, einen leeren Iterator im Allgemeinen zu erstellen.
Wenn es bei der Frage tatsächlich darum geht, wie ein leerer Iterator am besten erstellt werden kann, können Sie Zectbumo zustimmen , iter(())
stattdessen einen zu verwenden. Es ist jedoch wichtig zu beachten, dass iter(())
keine Funktion zurückgegeben wird! Es gibt direkt eine leere iterable zurück. Angenommen, Sie arbeiten mit einer API, die eine aufrufbare Datei erwartet, die eine iterable zurückgibt . Sie müssen so etwas tun:
def empty():
return iter(())
(Gutschrift sollte an Unutbu gehen, um die erste richtige Version dieser Antwort zu geben.)
Vielleicht finden Sie das oben Genannte klarer, aber ich kann mir Situationen vorstellen, in denen es weniger klar wäre. Betrachten Sie dieses Beispiel einer langen Liste von (erfundenen) Generatorfunktionsdefinitionen:
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
Am Ende dieser langen Liste würde ich lieber etwas mit einem yield
darin sehen, wie folgt:
def empty():
return
yield
oder in Python 3.3 und höher (wie von DSM vorgeschlagen ):
def empty():
yield from ()
Das Vorhandensein des yield
Schlüsselworts macht auf den ersten Blick deutlich, dass dies genau wie alle anderen nur eine weitere Generatorfunktion ist. Es dauert etwas länger, bis festgestellt wird, dass die iter(())
Version dasselbe tut.
Es ist ein subtiler Unterschied, aber ich denke ehrlich, dass die yield
basierten Funktionen besser lesbar und wartbar sind.
if False: yield
aber immer noch etwas verwirrend für Leute, die dieses Muster nicht kennen