Python中的迭代器

2021-09-24 13:41:27 字數 2568 閱讀 8499

以下是python文件中對於迭代器型別的描述

python有乙個在容器上進行迭代的概念。其實現需要兩個方法來支援;這讓使用者自己定義的類也可以支援迭代。序列型別都支援迭代方法。

容器物件需要提供乙個方法來提供對於迭代的支援:

container.__iter__():這個方法返回乙個迭代器物件。這個物件必須支援後面所描述的迭代器協議。如果乙個容器要支援不同型別的迭代,則可以提供額外的方法來專門為這些迭代型別請求相應的迭代器。(物件支援多種迭代形式的乙個例子就是樹資料結構中對廣度優先和深度優先遍歷的支援)。這個方法對應於python/c api中python物件型別結構體中的tp_iter欄位。

迭代器物件自身必須具有如下兩個方法,這兩個方法一起就構成了迭代器協議:

iterator.__iter__()

返回迭代器物件自身。這是為了讓容器和迭代器都能支援for和in語句。這個方法對應於python/c api中python物件型別結構體中的tp_iter欄位。

iterator.__next__()

python定義了幾種迭代器物件來支援對常規和特定序列型別、字典和其它特殊型別的迭代。特定型別主要地,就是實現了迭代器協議而已。

一旦迭代器的__next__()方法丟擲了stopiteration異常,隨後的呼叫中也必須這樣做。不遵守此種行為的情況被視為迭代器已損壞。

class ******iterator:

def __init__(self, max_index, position=0):

self._position = position

self._max = max_index

def __iter__(self):

return self

def __next__(self):

current_position = self._position

if current_position <= self._max:

self._position += 1

return current_position

else:

raise stopiteration

if __name__ == '__main__':

******_iterator = ******iterator(100)

for item in ******_iterator:

print(item)

這是乙個非常簡單的迭代器,在其上迭代可以依次訪問從初始化的position到max_index的所有整型數,並且是個閉區間(我在條件中使用了<=)。

現在我們實現了迭代器,如果想要讓容器支援迭代器協議,按照上面文件的說法,就應該在乙個容器內部定義乙個__iter__()方法,並且要求其返回乙個迭代器物件,我寫了乙個簡單的支援迭代的容器類,它可以支援正序和反序迭代容器中的內容:

class reverseiterator:

def __init__(self, seq=):

self._seq = seq

self._current_index = len(self._seq) - 1

def __iter__(self):

return self

def __next__(self):

if self._current_index < 0:

raise stopiteration

use_index = self._current_index

self._current_index -= 1

return self._seq[use_index]

class ******container:

def __init__(self, seq=, reverse=false):

self._seq = seq

self._reverse = reverse

def __iter__(self):

if not self._reverse:

return iter(self._seq)

else:

return reverseiterator(self._seq)

if __name__ == '__main__':

print("reverse=false")

******_container = ******container([1, 2, 3], reverse=false)

for item in ******_container:

print(item)

print("reverse=true")

******_container = ******container([1, 2, 3], reverse=true)

for item in ******_container:

print(item)

這裡面,我使用了iter內建函式用來獲取list型別的迭代器,用來支援預設的正序迭代;為了支援反序迭代,我自己實現了乙個迭代器,根據容器的建立引數,容器的__iter__()方法會返回不同型別的迭代器,以支援不同型別的迭代。

以上。

python中迭代器 python中的迭代器

如果給定乙個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代 iteration d for key in d print key ac b當我們使用for迴圈時,只要作用於乙個可迭代物件,for迴圈就可以正常執行,而我們不太關心該物件究竟是list還...

Python中的迭代器

可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的生成器函式。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable python的for迴圈本質上就是通過不斷呼叫n...

python中的迭代器

什麼是迭代器?迭代器是帶有next方法的簡單物件,當然也要實現 iter 函式。迭代器能在一串行的值上進行迭代,當沒有可供迭代時,next方法就會引發stopiteration 的異常。python中有很多的物件都是迭代器,例如 列表,元素,字串,檔案,對映,集合 如何使用迭代器?1.for 變數 ...