1. 程式人生 > >迭代器和可迭代物件

迭代器和可迭代物件

基於python3

迭代器 = 可迭代的物件
可迭代的物件 != 迭代器

講在前面:
返回迭代器的物件,有:open(), map(), zip()和filte()函式,這幾個函式直接返回迭代器也就是可以直接在結果中呼叫next
如:

f = open('xxx.txt')
while true:
	print(next(f))
# 結果是逐個返回檔案物件中的各個行

返回的可迭代物件有:range(), list(), set(), dict(), dict.keys()等等,都是返回可迭代物件,不可以直接使用next() 方法,必須在迭代工具中或者手動履行迭代協議。

如:

for i in range(1, 3):
		print(i)

或者手動實現迭代協議

x = iter(range(1, 3))
while True:
	print(next(x))

很重要的一點:
迭代工具,如for … in …; 列表解析等,那些在從左向右掃描迭代物件的工具,在其內部自動實現了迭代協議,即呼叫iter和–next–()對於迭代器的–next–()方法,當迭代到末尾時會引發一個StopIteration錯誤。

迭代器和迭代物件的區別確實不是很清晰,只能通過能不能直接使用next()方法來確定。
當然,我們使用迭代器或者可迭代物件的時候一般都是在可迭代工具裡面,它會自動幫助我們實現迭代協議,所以在大多數情況下我們不需要在意這些細節,只有我們要對一個物件使用next()方法時,我們要不要先使用iter()方法的問題,如果你不確定就都是用一下也是沒有問題的。我們將迭代器,其實主要一點還是與生成器的觀點進行一下重合,下一屆我們將講一下生成器。