2017-07-26 3 views
0

Siehe die Konsolensitzung unter:Warum sendet der Generator Methoden-Druckergebnisse ohne Aufruf der Druckfunktion an den Bildschirm?

>>> def f(x): 
... for _ in range(10): 
... y = yield 
... x.append(y) 
... yield x 
... 
>>> x = [] 
>>> g = f(x) 
>>> for _ in g: 
... g.send(1) 
... 
[1] 
[1, 1] 
[1, 1, 1] 
[1, 1, 1, 1] 
[1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

beachten, dass das Verfahren den Generator .send() Ausgabe auf den Bildschirm zu bedruckenden verursacht. Ich glaube, es ist die .send() Methode verursacht, weil, wenn die Generator-Ausgabe None ist, dann nichts auf den Bildschirm gedruckt wird (was der übliche Fall mit None ist).

>>> x = [] 
>>> g = f(x) 
>>> for i in g: 
... g.send(1) 
... 
>>> x 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

Außerdem, wenn wir durchlaufen gerade ohne jede Eingabe zu senden, gibt es nichts auf dem Bildschirm ausgegeben wird (tritt mit jeder Version von f oben):

>>> x = [] 
>>> g = f(x) 
>>> for i in g: 
... pass 
... 
>>> 

Kann jemand erklären, warum diese Ausgabe tut auf den Bildschirm passiert? Ich denke, dass hier etwas Interessantes vor sich geht, aber ich weiß nicht, was es ist.

Um zu klären, ich vermute es hier nichts kompliziert los ist als das, was passiert, wenn Sie dies tun:

>>> [] 
[] 

Die Konsole nur ist das Ergebnis eines Ausdrucks zu wiederholen. Aber warum verhält sich die Konsole so, als ob im obigen Fall ein wiederholter Ausdruckseintrag stattgefunden hätte?

+2

Minimal Beispiel: '>> > während True: 0' –

+0

@JoshLee das erklärt alles. und zum Glück wusste ich es besser als es zu tun. :) –

Antwort

1

Vom Python docs:

Die send() Methode gibt den nächsten Wert vom Generator erbrachte oder StopIteration hebt, wenn der Generator verlässt, ohne einen anderen Wert ergibt.

Jedes Mal, wenn Sie die Methode send() aufrufen, wird der nächste Wert zurückgegeben, der vom Generator geliefert wurde.

Im interaktiven Terminal werden diese zurückgegebenen Ergebnisse auf dem Bildschirm ausgegeben. Nichts zu Magisches.

+0

macht Sinn. Ich denke, ich weiß nicht, warum ich das überraschend fand, aber ich tat es. –

0

Ich fühle mich dumm. Die Antwort ist so einfach! Dies ist ein Ausdruck:

g.send(1) 

... und wie jeder andere Ausdruck, wird es an den Konsolen- mehrmals gedruckt werden, wenn innerhalb einer Schleife:

>>> 0 
0 
>>> for _ in range(2): 
... 0 
... 
0 
0 
Verwandte Themen