2016-06-12 11 views
1

Ich lerne Coroutine, ich habe ein PDF mit dem Namen "Ein neugieriger Kurs über Coroutines und Concurrecy" gefunden. Es ist ein flockiges Beispiel:Python, warum bekomme ich ein unterschiedliches Ergebnis zwischen .py und shell, wenn ich Generatorertrag verwende?

def countdown(n): 
print("Counting down from", n) 
while n >= 0: 
    newvalue = (yield n) 
    # If a new value got sent in, reset n with it 
    if newvalue is not None: 
     n = newvalue 
    else: 
     n -= 1 

ich es in einer Datei "bogus.py" genannt gesetzt haben, dann ging ich in die Python-Shell ..

>>> from bogus import countdown 
>>> c = countdown(5) 
>>> for n in c: 
...  print(n) 
...  if n == 5: 
...   c.send(3) 
... 
Counting down from 5 
5 
3 
2 
1 
0 
>>> 

Ja, ich habe 5 3 2 1 0 ... Aber wenn ich diese Aussagen in die bogus.py setzte, bekam ich das andere Ergebnis ...

def countdown(n): 
print("Counting down from", n) 
while n >= 0: 
    newvalue = (yield n) 
    # If a new value got sent in, reset n with it 
    if newvalue is not None: 
     n = newvalue 
    else: 
     n -= 1 

c = countdown(5) 
for n in c: 
    print(n) 
    if n == 5: 
     c.send(3) 

dann ...

$ python bogus.py 
Counting down from 5 
5 
2 
1 
0 

Ich habe 5 2 1 0 ...! Wo ist die 3? Ich bin so verwirrt, und ich wirklich nicht kwow warum ... Bitte helfen Sie mir, und Entschuldigung für mein Englisch.

oh, finde ich auch, wenn ich ein wenig in Shell-Code geändert, dann bekam ich:

>>> from bogus import countdown 
>>> c = countdown(5) 
>>> for n in c: 
...  print(n) 
...  if n == 5: 
...   k = c.send(3) 
... 
Counting down from 5 
5 
2 
1 
0 
>>> 

Antwort

2

Im interaktiven Modus Python Auto-druckt die repr jeden Ausdruck Anweisung, die andere als None etwas auswertet . Dies schließt Ausdruck Aussagen innerhalb von Funktionen und Klassen, aber es enthält Ausdruck Aussagen in Schleifen, wie diese:

>>> for n in c: 
...  print(n) 
...  if n == 5: 
...   c.send(3) # <- right here 

Das ist, wo die 3 von im interaktiven Modus kommt. Persönlich bin ich nie auf eine Situation gestoßen, in der dieses Verhalten wünschenswert ist.