2014-10-01 56 views
1

我想了解發電機和所遇到下面的代碼:發電機在Python查詢

def reverse(data): 
    for index in range(len(data)-1, -1, -1): 
     yield data[index] 


for s in reverse([1,2,3]): 
    print s 

我明白,我們在指數2,減量在-1開始通過1和結束。我沒有得到的是,事實上,我認爲停止點-1應該參考"3",但它似乎指的是"1"在這裏? :

3 
2 
1 

感謝

+1

在假設之前檢查'range(len(data)-1,-1,-1)'的輸出關於停車點的任何事情(特別是因爲證據點違揹你的假設) – njzk2 2014-10-01 22:13:48

+1

'range'實際上在上限之前停止。假設它的行爲方式是確保'我在範圍內(3)'將按照大多數人所期望的那樣迭代3次,'i'取值爲'[0,1,2]'。在你的情況下,'range(2,-1,-1)'輸出'[2,1,0]',這對應於你所看到的輸出的索引。 – 2014-10-01 22:16:05

回答

1

請參閱https://docs.python.org/2/library/functions.html#range看到的範圍是如何工作的。我可以看到它最初可能會讓人閱讀文檔時感到困惑,但希望下面的解釋對你有所幫助。

具體來說,上述文檔中的這些行可以回答你的問題: '完整的表單返回一個普通整數列表[start, start + step, start + 2 * step, ...]。如果step爲正數,則最後一個元素爲最大start + i * step小於stop;如果步是否定的,最後一個元素是不是停止更大最小start + i * step

在你的情況start=2(LEN(數據)-1), stop =-l and step=-1。因此,潛在的整數列表將是[2, 2-1, 2-2*1, 2-3*1 ...],它是[2,1,0,-1 ...]。然而,由於你的步驟是否定的,即-1,所以最後一個元素將是最小的(start + i*step)大於停止。在潛在列表中,大於停止,即大於-1的最小項目爲0.因此range(len(data)-1, -1, -1)返回[2,1,0]