2014-06-25 181 views
0

我推理的缺陷在哪裏?根據我的理解,yield的作用類似於返回生成器以繼續迭代的return語句。我期待代碼繼續添加到列表中,但我得到一個錯誤。收益率連接清單

def method(self): 
    samplelist = [] 
    while(condition): 
     #the data is collected 
     samplelist = data 
     yield samplelist 

finalList += file.method() 

編輯: 我最初的錯誤是由於試圖以連接finalList使用+ =時,它沒有一個初始值。這是通過使用finalList.append()解決的,但是,yield仍然無法正常工作,如果有人能夠幫助我理解原因,我將非常感激。

有一個相當有用的答案發布,然後刪除出於某種原因。但它解釋說,產量實際上正在返回一個發電機對象。從這我嘗試了幾個不同的東西。

1他們還建議使用list(file.method())來遍歷它。但是,這進一步將finalList的類型更改爲元組,並且與我的其他代碼不兼容。

2我試圖遍歷做

for x in file_writer.write_records(): 
    sample.append(x) 

但具有相同的結果的對象。我如何附加發生器對象的值?

+2

什麼錯誤?.... – sshashank124

+1

你的問題是,它的方法被定義後,它可能被調用? – Korem

+3

請注意,'method'的返回值不是一個列表,它是一個生成器對象。如果要訪問已生成的項目,必須使用for循環遍歷它,或者在生成器上調用next,或者將其轉換爲列表。 – Kevin

回答

1

我打算忽略這個顯而易見的事實,那就是file.method()沒有在您的發佈代碼中聲明,因此無法在您顯示時調用。所以我會把你的發電機功能稱爲method()。如果你可以發佈可以工作的代碼,或者至少是一致的,那將是有用的。

method()返回一個生成器,而不是一個列表。您可以通過

>>> method() 
<generator object f at 0x7f8b7a5bda50 

您需要解析生成器。這可以通過調用它list()做到:

finalList += list(method()) 

現在finalList將有method()附加到它的結果。請注意,這將會多次調用生成器,直到滿足condition。當新的數據產生時,你的代碼可能會掛起,但是完成了。您可以通過在yield之後添加一個print語句來查看返回到生成器的控件。

這將是更多的對你有用:

for l in method(): 
    finalList.extend(l) 
    # process finalList.... 

現在控制每個數據生成後返回到調用代碼,並且調用代碼有機會進行這項工作。

順便說一句,你不需要在循環中重新初始化samplelist = []

+0

我不是故意追加到樣本清單,rebind罰款,因爲我的意思是追加每個rebind使用收益除了finalList我不確定它爲什麼不起作用 –

+0

@JohnSmith在你的澄清之後更新了答案,比如它。 – mhawke