2016-12-01 61 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 

更新:sendnext被稱爲首次發電機從開始執行到第一個yield語句,在該語句中返回值給調用者。這就是爲什麼value is:文字在首次通話時沒有看到。當第二次調用sendnext時,執行從yield恢復。如果send被調用,給定的參數由yield語句返回,否則yield返回None

+0

如果我只是使用z1.next(),它會打印數字;當使用「print z1.next()」時,出現「value is」語句。爲什麼? – Troskyvs

+0

@Troskyvs更新了答案,希望能回答你的問題。 – niemmi

+0

謝謝,我開始理解你的觀點,在發生器內部,「val = yield i」表示val從外部「發送」命令設置,而外部調用者從「yield i」獲取返回值。這很難理解爲什麼「next()」等於「send(None)」,因此val是「None」。 – Troskyvs