2010-01-07 8 views
29

Ich bin vertraut mit der Rendite, um einen Wert dank der this questionWas ergibt sich als Zuweisung? myVar = (yield)

zurückgeben, aber was macht Ausbeute, wenn es auf der rechten Seite einer Aufgabe ist?

@coroutine 
def protocol(target=None): 
    while True: 
     c = (yield) 

def coroutine(func): 
    def start(*args,**kwargs): 
     cr = func(*args,**kwargs) 
     cr.next() 
     return cr 
    return start 

ich auf diese kam, auf den Codebeispielen von this blog, während Zustandsmaschinen und Koroutinen forschen.

Antwort

35

Die in einer Funktion verwendete Anweisung yield wandelt diese Funktion in einen "Generator" um (eine Funktion, die einen Iterator erstellt). Der resultierende Iterator wird normalerweise durch Aufrufen von next() fortgesetzt. Allerdings ist es möglich, Werte an die Funktion zu senden, indem die Methode send() statt next() nennt es wieder aufnehmen:

cr.send(1) 

In Ihrem Beispiel dieser den Wert 1-c jedes Mal zuweisen würde.

cr.next() ist effektiv äquivalent zu cr.send(None)

+0

+1 für eine gute Erklärung –

+1

Just zu beachten, bevor aufrufen zu können, 'send()' an einem Generator, müssen Sie 'nächsten Anruf()', um tatsächlich beginnen oder Sie erhalten einen TypeError, der sagt: 'TypeError: kann keinen Nicht-None-Wert an einen gerade gestarteten Generator senden ' – Caumons

11

Mit der Funktion send können Sie Werte an den Generator senden.

Wenn Sie ausführen:

p = protocol() 
p.next() # advance to the yield statement, otherwise I can't call send 
p.send(5) 

dann yield 5 zurückkehren, so im Inneren des Generators c 5.

Auch sein wird, wenn Sie p.next() anrufen, wird yieldNone zurück.

Sie finden weitere Informationen here.

Verwandte Themen