簡述Python迭代器

2022-06-27 16:57:18 字數 2371 閱讀 6750

物件必須提供乙個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...