Python中Iterator迭代器的使用雜談

2022-10-04 21:48:37 字數 4083 閱讀 5493

迭代器是一種支援next()操作的物件。它包含一組元素,當執行next()操作時,返回其中乙個元素;當所有元素都被返回後,生成乙個stopiteration異常。

>>>a=[1,2,3]

>>>ia=iter(a)

>>>next(ia)

1>>>next(ia)

2>>>next(ia)

3>>>next(ia)

traceback (most recent call last):

file "", line 1, in

stopiteration

ite()可以接受多種python物件為引數,比如list,tuple, dict, set等,並將其轉化為迭代器。迭代器可以用於for語句或in語句中。很多常用操作也是支援迭代器的,比如sum(), max()等。

>>> b=[4,5,6]

>>> ib=iter(b)

>>> for x in ib:

... print(x)

...456

>>> ic=iter(b)

>>> sum(ic)

15>>> id=iter(b)

>>> max(ic)

6毋庸置疑,迭代器有很多好處:

1.「流式」資料處理方式減少記憶體消耗:

比如處理檔案,一下猛地把全部資料全部取出來放到記憶體裡面進行處理會導致程式消耗大量記憶體,有時甚至沒法做到,一般我們會一部分一部分的對檔案內容進行處理:

for text_line in open("xx.txt"):

print text_line

2.或者對xml檔案進行處理的時候:

tree = etree.iterparse(xml, ['start', ''])

for event, elem in tree:

if event == "end"

result = etree.tostring(elem)

elem.clear()

print result

內建函式open返回的file物件和etree.iterparse序列化的xml tree都是可迭代物件,能夠讓我們漸進式地對檔案的內容進行處理。

3.支援方便用for語句對資料進行消費:

python內建的一些常見的像型別像陣列、列表甚至字串等都是可迭代型別,這樣我們就能方便for語句這個語法糖方便對資料進行消費,不需要自己記錄索引位置,人肉迴圈:

for i in [1, 2, 3, 4]

print i,

簡單了解了一下迭代器的好處後,我們正正經經的聊聊python的迭代器模式。

在這裡我們引入兩個比較繞口的名詞:可迭代物件和迭代器物件,個人覺得從這兩個概念下手會對迭代器有比較好的理解。在放例子前先對這兩個概念給乙個不入流的解釋:

可迭代物件:物件裡面包含__iter()__方法的實現,物件的iter函式經呼叫之後會返回乙個迭代器,裡面包含具體資料獲取的實現。

迭代器:包含有next方法的實現,在正確範圍內返回期待的資料以及超出範圍後能夠丟擲stopiteration的錯誤停止迭代。

放個例子邊看邊說:

class iterable_range:

def __init__(self, n):

self.n = n

def __iter__(self):

return my_range_iterator(self.n)

class my_range_iterator:

def __init__(self, n):

self.i = 0

self.n = n

def next(self):

if self.i < self.n:

i =dcpwpq self.i

self.i += 1

print 'iterator get number:', i

return i

else:

raise stopiteration()

例子中的iterable_range是乙個可迭代物件,所以我們也能夠對它用for語句來進行迭代:

temp = my_range(10)

for item in temp:

print item,

輸出:my iterawww.cppcns.comtor get number: 0

0 my iterator get number: 1

1 my iterator get number: 2

2 my iterator get number: 3

3 my iterator get number: 4

4 my iterator get number: 5

5 my iterator get number: 6

6 my iterator get number: 7

7 my iterator get number: 8

8 my iterator get number: 9

9大家可以仔細地看一下輸出的日誌:

可迭代物件其實更像是整個迭代器模式模式的上層,像一種約束一種契約一種規範,它能夠保證自己能夠返回乙個在實際工作中幹活的迭代器物件。for、sum等接受乙個可迭代物件的方法都是遵循這樣的規範:呼叫物件的__iter__函式,返回迭代器,對迭代器物件返回的每個值進行處理抑或需要一些彙總的操作。拿for舉個例子:

iterator_object = iterable_object.__iter__()

while true:

try:

value = iterator_object.next()

except stopiteration:

# stopiteration exception is raised after last element

break

# loop code

print value

for這個語法糖背後的邏輯差不多就是上面例子中代www.cppcns.com碼所示的那樣:首先獲取可迭代物件返回的迭代器物件,然後呼叫迭代器物件的next方法獲取每個值,在獲取值的過程中隨時檢測邊界-也就是檢查是否丟擲了stopiteration這樣的錯誤,如果迭代器物件丟擲錯誤則迭代停止(note:從這個例子可以看出,對於那些接受可迭代物件的方法,如果我們傳乙個單純的迭代器物件其實也是無法工作的,可能會報出類似於typeerror: iteration over non-sequence的錯誤)。

當然了,一般在應用過程中我們不會將他們特意的分開,我們能夠稍微對迭代器物件進行修改一下,新增__iter__方法的實現,這樣物件本身就既是可迭代物件也是乙個迭代器物件了:

class my_range_iterator:

def __init__(self, n):

self.i = 0

self.n = n

def __iter__(self):

return self

def next(self):

if self.i < self.n:

i = self.i

self.i += 1

print 'my iterator get number:', i

return i

else:

raise stopiteration()

for item in my_range_iterator(10):

print item

輸出:my iterator get number: 0

0 my iterator get number: 1

1 my iterator get numb程式設計客棧er: 2

2 my iterator get number: 3

3 my iterator get number: 4

4 my iterator get number: 5

5 my iterator get number: 6

6 my iterator get number: 7

7 my iterator get number: 8

8 my iterator get number: 9

9本文標題: python中iterator迭代器的使用雜談

本文位址:

python的迭代器iterator

可以被next函式呼叫不斷返回下乙個值的物件稱為迭代器 iterator 可以直接用於for迴圈的物件稱為可迭代物件 iterable 所有的可迭代物件均可以通過iter函式轉變為迭代器。事實上,for迴圈內部先呼叫iter 把iterable變成iterator然後再進行迴圈迭代 iterator...

Python 學習筆記 關於 Iterator

iterator 是 迭代器 的意思,iterator 與 iterable 物件 不同。從字面上理解,迭代器 與 可迭代物件 當然不同。從性質上理解,iterable 實際上是乙個惰性序列,需要用 next 來計算序列的下乙個內容,也可以使用 for 迴圈遍歷 如果有界的話 而 iterable ...

Python程式設計 iterator迭代器

可以直接作用於for迴圈的物件 1 集合資料型別 list,tuple,dict,set,str 2 generator 包括生成器和帶yield的生成器函式 可以被next 函式呼叫,並不斷返回下乙個值的物件 表示乙個資料流,甚至是無窮大的資料流,如全體自然數 惰性計算 from collecti...