物件必須提供乙個next方法,執行方法要麼返回迭代器的下一項,要麼就引起乙個stopiteration異常,以終止迭代。
協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum、min、max函式等)使用迭代器協議訪問物件。
實現了迭代器協議的物件叫可迭代物件,滿足以下條件的物件可以成為可迭代物件:
物件實現了__iter__方法
__iter__方法返回乙個迭代器物件
我們經常用for迴圈去遍歷乙個容器,其實就是for語句內部先呼叫了物件的__iter__方法,獲取乙個迭代器物件,接著不停的呼叫迭代器物件的__next__方法,迴圈遍歷取值。
迭代器協議包括這些條件:
物件實現__next__方法
__next__方法返回某個數值
__next__方法取完所有值的時候,丟擲stopiteration的異常資訊
在python中,任意物件,只要定義了__next__方法,它就是乙個迭代器。
因此,python中的列表、元組、字串都可以稱作迭代器。
迭代的定義:迭代就是從迭代器中取元素的過程。
比如從乙個列表中用for迴圈遍歷元素的過程就叫做迭代。
data_list = ['a', 'b', 'c']
for data in data_list:
print(data)
除了用for迴圈遍歷,我們還可以用以下方式來進行迭代:
先呼叫容器的iter()函式
再使用next()內建函式來呼叫物件的__next__()方法
迭代完所有元素後,next()丟擲stopiteration異常資訊
data_list = ['a', 'b', 'c']
i = iter(data_list)
print(next(i))
print(next(i))
print(next(i))
print(next(i))
結果如下
abc
traceback (most recent call last):
file "", line 1, in print(next(i))
stopiteration
我們來嘗試手寫乙個迭代器,來生成偶數序列。
按照迭代器協議,我們實現上述的兩個方法
class even:
def __init__(self, start=0, end=4):
self.start = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.start > self.end:
raise stopiteration
result = self.start
self.start += 2
return result
首先我們例項化乙個even類得到乙個物件even
even = even()
print(even)
列印如下
<__main__.even object at 0x000002c2cfd2f588>
使用iter()方法會呼叫even中的__iter__()方法,得到它本身
even = even()
i = iter(even)
print(i)
列印如下
<__main__.even object at 0x000002331b7af588>
使用next()方法會呼叫對應的__next__()方法,得到下乙個元素
print(next(even)) # 0
print(next(even)) # 2
print(next(even)) # 4
print(next(even)) # 丟擲stopiteration異常資訊
可以看出,我們成功寫出了乙個迭代器even
既然even是乙個迭代器,我們嘗試用for來遍歷它
for e in even:
print(e)
結果如下:
0
24
遍歷完所有值後,並沒有看到丟擲stopiteration,那是因為for語句內部通過捕捉這個異常來確定迴圈是否結束。 迭代器簡述
迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。list tuple等都是可迭代物件,我們可以通過iter 函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使用next 函式...
迭代器與生成器(python)簡述
迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和next 字串,列表或元組物件都可用於建立迭代器 在 python 中,使...
python 迭代器 python迭代器
迭代器 可以直接作用for迴圈的資料型別 我們已經知道,可以直接作用for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function 可迭代物件定義 這些可以直接作用fo...