關於生成器和迭代器
阿新 • • 發佈:2018-11-10
首先,我們要討論的三個物件:可迭代物件(iterables)、迭代器(iterator),生成器(generator)。
可迭代物件是每次可以返回一個元素的物件,如list,典型的可迭代物件。
事實上我們用到的很多內建函式,都會返回一個迭代器,如enumerate,zip。迭代器是一種表示資料流的物件,列表只是可迭代物件,不是迭代器,因為他不是資料流。迭代器用iter()函式得到:
list1=[1,2,3,4] list2=iter(list1) print(next(list2)) print(next(list2)) >>>1 >>>2
生成器,是用來創造迭代器的一種簡單方式,但不是唯一方式。生成器函式如下:
def range(x):
i=0
while i<x:
yield i
i+=1
該函式就是一個生成器函式,注意有yield是生成器函式的標誌。呼叫它
range(4)就會返回一個生成器(generator):
type(range(4))
>>> <class 'generator'>
for i in range(4):
print(i)
注意:遍歷了生成器元素之後,它裡面就沒有元素了,再用list(range(4))它返回的只能是一個空列表,[ ].
也可以用以下式子得到生成器:
get_data = (i for i in range(10))
print(type(get_data))
>>> <class 'generator'>
遍歷它來得到其中的元素(只能遍歷一次)。
迭代器也具有同樣的性質,裡面的元素只能用一次:
如圖,把迭代器b變成list後,再去迭代它,什麼都沒有得到。
即使不列印list(b),只要它list化了,迭代器b裡面就已經沒有元素了,所以執行結果為空。
如圖,如果先迭代,再列印list(b),則它沒有元素,得到的是空列表。
注意即使迭代器b裡面沒有元素了,它仍是迭代器:
可以看到b的元素迭代完之後,得到的只能說空列表,然而b還是那個迭代器(iterator),它的地址沒有變,只是裡面沒有元素了。