1

私はhttp://www.dabeaz.com/coroutines/を見ていましたが、これは非常に興味深いと思いますが、例では理解できない動作があります。

bogus.pyの例では、ここで報告されています

# bogus.py
#
# Bogus example of a generator that produces and receives values
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

# The holy grail countdown
c = countdown(5)
for x in c:
    print x
    if x == 5:
        c.send(3)

send(3)生成された数字のシーケンスは5、2、1、0nであり、数字 3 がどこに消えたのか理解できませんyield。 for ループに渡されません。

なぜこれが起こるのか誰かが私に説明できますか?

4

1 に答える 1

3

3から返されまし.send()たが、破棄されました。ジェネレーターは、、、、、を生成5します。しかし、が呼び出しに返されるため、その値が表示されません。ループはそれを見ることはありません。32103.send()for

何が起こるかは次のとおりです。

  • forループがジェネレーターで初めて呼び出さnext()れると、コードは生成されるまで進み5ます。
  • x == 5True、そうc.send(3)呼ばれます。コードはジェネレーター関数を介して進み、 にnewvalue設定され3ます。
  • ジェネレーターはそこで一時停止せ、制御できるようになりました。ジェネレーターはwhileループを実行し、式に戻り(yield n)ます。3が得られます。の戻り値となりますc.send(3)。戻り値はここで破棄されます。
  • forループが続き、再度呼び出しますnext()。ジェネレーターは、 return 、 loops へのラウンド、および yieldingyieldで再び続行されます。Nonen -= 12
  • forループは引き続きnext()ジェネレーターを呼び出し、解放される10、ジェネレーターは終了します。

generator.send()ドキュメントからの引用:

実行を再開し、値をジェネレーター関数に「送信」します。value引数は、現在の式の結果になりますyieldこのsend()メソッドは、 generator によって生成された次の値を返すStopIteration、ジェネレータが別の値を生成せずに終了した場合に発生します。

鉱山を強調します。

于 2013-08-01T09:59:04.593 に答える