0
def h():  
    print 'Wen Chuan',
    m = yield 5 # Fighting!  
    print m  
    d = yield 12  
    print 'We are together!'  
c = h()  
m = c.next() #m gets the value of yield 5
d = c.send('Fighting!') #d gets the value of yield 12
print 'We will never forget the date', m, '.', d

上記のコードを確認してください。実行結果は以下です。

>>> ================================ RESTART ================================
>>> 
Wen Chuan Fighting!
We will never forget the date 5 . 12

そして、私の理解によると、最初の利回りの戻り値は「Fighting! 」に変更されます。すでにprint m値 5 が表示されているのに、なぜ後で表示されるのでしょうか?

4

2 に答える 2

2

いいえ、yield 5式がジェネレーターに生成させるものを変更していません。

.send()ローカルm 内部h()のみに設定されるものを変更します。

何が起こるか:

  • h()ジェネレーター関数を作成すると、実行が凍結されます。
  • .next()ジェネレーターを呼び出します。実行が再開され、出力'Wen Chuan'され、式までコードが実行されyield 5ます。5が返され、 global に割り当てられmます。ジェネレーターは再び一時停止します。
  • を呼び出しますc.send('Fighting!')。実行が再開され、ジェネレーター関数'Fighting!'のローカル変数に割り当てられ、それが出力されます。が実行されると、ジェネレーターは一時停止され、グローバル変数 に割り当てられます。mprint myield 1212d
  • 'We will never forget the date', 5, '.', 12印刷されます。

この時点で、ジェネレーター関数はまだ一時停止されており、ジェネレーター関数の最後の行は実行されません。.next()もう一度呼び出すと、'We are together!'出力され、ジェネレーターが終了し、発生しStopIterationます。

于 2013-07-13T07:34:55.623 に答える
1

m関数の内側と外側は、互いに影響を与えない別個の変数です。

于 2013-07-13T07:34:43.127 に答える