2016-12-01 1 views
4

Ich versuche Sendefunktion des Generators, ich war, dass die Sende erwartet den Wert ändern, die Ausbeute ist ist, so habe ich versucht, in ipython:Python "senden" -Methode ändert nicht den Wert von "nächsten"?

In [17]: def z(n): 
    ...:  i=0 
    ...:  while(i<n): 
    ...:   val=yield i 
    ...:   print "value is:",val 
    ...:   i+=1 
    ...: 
In [24]: z1=z(10) 
In [25]: z1.next() 
Out[25]: 0 

In [26]: z1.send(5) # I was expecting that after "send", output value will become "5" 
value is: 5 
Out[26]: 1 

In [27]: z1.next() 
value is: None # I was expecting that z1.next() will restart from "6" because I sent "5" 
Out[27]: 2 

Nun, ich glaube, ich falsches Verständnis davon hatten, was wirklich „senden“ tut , wie man es korrigiert?

Antwort

6

Sie geben i, aber Sie nicht den Rückgabewert von yield Anweisung zuweisen. Wenn Sie den Rückgabewert zuweisen Sie die Ausgabe sehen Sie erwarten:

def z(n): 
    print 'Generator started' 
    i=0 
    while(i<n): 
     val=yield i 
     print "value is:",val 
     if val is not None: 
      i = val 
     i+=1 

z1=z(10) 
print 'Before start' 
print z1.next() 
print z1.send(5) 
print z1.next() 

Ausgang:

Before start 
Generator started 
0 
value is: 5 
6 
value is: None 
7 

Update: Wenn send oder next zum ersten Mal aufgerufen wird der Generator vom Start ausgeführt wird an die erste yield Anweisung, bei der der Wert an den Aufrufer zurückgegeben wird. Deshalb wird value is: Text beim ersten Aufruf nicht angezeigt. Wenn send oder next zum zweiten Mal aufgerufen wird, wird die Ausführung von yield fortgesetzt. Wenn send aufgerufen wurde, wird der angegebene Parameter von der yield-Anweisung zurückgegeben, andernfalls yield gibt None zurück.

+0

Wenn ich einfach z1.next() verwende, druckt es Zahlen; Wenn Sie "print z1.next()" verwenden, wird die Anweisung "value is" angezeigt. Warum? – Troskyvs

+0

@Troskyvs Aktualisiert Antwort ein wenig, hoffentlich, dass die Antworten auf Ihre Frage. – niemmi

+0

Danke, ich begann Ihren Punkt zu verstehen, innerhalb des Generators bedeutet "val = yield i", dass val vom äußeren "send" -Befehl gesetzt wird, während der äußere Aufrufer den Rückgabewert von "yield i" erhält. Das ist wirklich schwierig zu verstehen, warum "next()" gleich "send (None)" ist und somit val "None" ist. – Troskyvs

Verwandte Themen