# Iterator and Iterable 最近在處理gcp datastore下來的資料時發現一個情況之前沒有處理過,簡單介紹一下 假設我們有一個列表,其中包含了一些數字: ```python= numbers = [1, 2, 3, 4] # 遍歷列表並顯示每個數字 for number in numbers: print(number) # 再次遍歷列表並顯示每個數字 for number in numbers: print(number) ``` 毫無問題,肯定是印兩次1234 但假設今天拿到的不是list或別的iterable object,而是iterator: ```python= # 將列表轉換為迭代器 numbers_iter = iter(numbers) # 遍歷迭代器並顯示每個數字 for number in numbers_iter: print(number) # 1 2 3 4 # 再次遍歷迭代器 for number in numbers_iter: print(number) # StopIteration error ``` 這是由於python iterator的運作方式就像linked list一樣,在看到下一個元素時指標會一起往後跑,因此在第一次遍歷完畢的時候,這個iterator內的指標也跑到尾部了,因此若再對iterator做事(確切來說是呼叫__next__),就會得到StopIteration 。 回到開頭,我遇到的狀況是gcp調用datstore資料時,使用的query.fetch()會返回iterator,所以讓後面的list()或是for迴圈會出現上述的問題。 因此若各位平常有處理到迭代器的輸出,在使用上就必須要多注意瞜!