2016-12-01 6 views
4

私は送信だが降伏されて値を変更することを期待していた、発電機の送信機能をしようとしているので、私はipythonで試してみました:pythonの "send"メソッドは "next"の値を変更しませんか?

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 

まあ、私は私は本当にない「送信」何の間違った理解を持っていたと仮定、それを修正する方法?

答えて

6

iを返していますが、yield文の戻り値を割り当てていません。あなたは戻り値を代入した場合、あなたが期待する出力が表示されます。

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() 

出力:

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

アップデート:sendまたはnextが初めて呼び出されたときに発電機が最初から実行されます最初のyieldステートメントに、呼び出し元にポイント値が返されます。このため、最初の呼び出しでvalue is:のテキストが表示されません。 sendまたはnextが2回目に呼び出されると、実行はyieldから再開します。 sendが呼び出された場合、与えられたパラメータはyield文によって返されます。そうでない場合はyieldNoneを返します。

+0

私はちょうどz1.next()を使うと、数値を表示します。 "print z1.next()"を使用すると、 "value is"ステートメントが表示されます。どうして? – Troskyvs

+0

@Troskyvsあなたの質問への答えが少し更新されました。 – niemmi

+0

ありがとう、私はあなたのポイントを理解し始めました。 "val = yield i"は外側の "send"コマンドからvalが設定され、外側の呼び出し元は "yield i"から戻り値を取得することを意味します。これは、 "next()"が "send(None)"に等しい理由を理解するのは本当に難しいので、valは "None"です。 – Troskyvs

関連する問題