Für eine lange Zeit wusste ich nicht, dass Sie return
nicht vor einer Yield-Anweisung setzen können. Aber eigentlich können Sie:Wann verwenden Sie Rendite (etwas zurückgeben)?
def gen():
return (yield 42)
, der
ähnlich istdef gen():
yield 42
return
und die einzige Nutzung ich denken kann sind, gesendet Wert StopIteration
anhänge: pep-0380
Rückkehr ausdr in einem Generator bewirkt, dass StopIteration (expr) beim Verlassen des Generators ausgelöst wird.
def gen():
return (yield 42)
g = gen()
print(next(g)) # 42
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'
Dies kann aber auch mit einem zusätzlichen variablen erfolgen, was deutlicher ist:
def gen():
a = yield 42
return a
g = gen()
print(next(g))
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'
So scheint es return (yield xxx)
ist lediglich ein syntaktischer Zucker. Fehle ich etwas?
"Dies kann aber auch mit einer zusätzlichen Variablen geschehen, die expliziter ist" - das könnte man zu jeder 'return' Aussage sagen. 'return x + y 'wird zu z = x + y; z zurückgeben.'return foo()' wird 'x = foo(); gib x zurück. Es gibt nichts Spezifisches für "Rückkehr (Ausbeute was auch immer)" hier. – user2357112
Bei 'StopIteration'-Argumenten wird nicht explizit auf diese zugegriffen. Genau so werden die 'yield from'-Ausdrücke implementiert. Es ist ein veröffentlichter Teil der API, aber normalerweise kein interessanter Teil. – user2357112