可迭代物件 迭代器 生成器 總結

2021-10-23 18:30:08 字數 2034 閱讀 9074

關於這兩幾個概念,前後看了很多次,終於有些明白了,在這裡做個總結!

__iter__()

可迭代物件都具有該方法,該方法返回的是當前物件(例項本身就是迭代物件: return self )

__next__()

返回迭代的每一步,實現該方法時注意要最後超出邊界要丟擲stopiteration異常

from collections import iterable, iterator

a_list = [1, 2, 3]

print('a_list 是可迭代器嗎? ', isinstance(b, iterator))

a_list_iterator = iter(a_list) # 建立迭代器物件

print(a_list_iterator.__next__())

print(a_list_iterator.__next__())

print(a_list_iterator.__next__())

print(a_list_iterator.__next__())

>>>

a_list 是可迭代器嗎? false12

3traceback (most recent call last):

file "e:/test python/iterator_test.py", line 59, in print(a_list_iterator.__next__())

stopiteration

實現了__iter__方法,稱為可迭代物件,像list、dict物件,但不一定有__next__方法。

from collections import iterable, iterator

b = [x+1 for x in range(0, 5)]

c = iter(b) # 返回迭代器

print type(c)

print 'b 是可迭代物件', isinstance(b, iterable)

print 'b 是可迭代器', isinstance(b, iterator)

print 'c 是可迭代器', isinstance(c, iterator)

>>>

# 列表型別迭代器

b 是可迭代物件 true

b 是可迭代器 false

c 是可迭代器 true

那有人問了,不具有__next__方法,為什麼for迴圈可以輸出呢?

因為處理這些資料前,for迴圈會呼叫 __iter__() 方法,將這些資料轉化為乙個迭代器,然後依次呼叫__next__(),並處理stopiteration異常, 實現for迴圈。

實現了__iter__和__next__方法,迭代器一定是可迭代物件,是乙個可以記住遍歷的位置的物件,它從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束,只能往前不會後退。

特殊的迭代器,yield關鍵字可返回乙個迭代器,包括值和狀態,生成器終結時,還會自動丟擲 stopiteration 異常

生成器表示式:返回乙個物件,這個物件只有在需要的時候才產生結果

優點:按要求返回乙個物件,而不是構建乙個列表,從而節約了記憶體空間。

"""生成器函式"""

def iterator_test():

for i in range(10):

yield i

a = iterator_test()

print a.next() # 記錄了狀態

print a.next()

>>>01

"""生成器表示式"""

a = (i+1 for i in range(5))

print a

print type(a)

>>>

at 0x0000000003676d80>

生成器與迭代器的區別:生成器可以自動建立了 iter()和 next()方法,特別簡潔,使用生成器表示式取代列表解析可以同時節省記憶體。

可迭代物件 迭代器,生成器

可迭代物件 iterator 列表 集合 元組 字典 字串 生成器 我們可以使用isintance 判斷乙個物件是否是iterator物件 生成器 通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,如果我們僅僅需要訪問前面幾個元素,如果列表元素可以按照某種演算法推...

可迭代物件 迭代器 生成器

可迭代物件 for迴圈機制 迭代器生成器 總結type所返回的型別是例項物件的類物件,而isinstance所進行的判斷則包含了例項物件的類物件及其父類。如圖 可迭代物件 迭代器 生成器所屬的型別分別為collections包裡的iterable,iterator,generator.實現了 ite...

可迭代物件 迭代器 生成器

名詞解釋 可迭代物件 1 遵循了 實現了 迭代器協議的物件。物件內部定義了乙個 iter 方法,以實現迭代器協議 2 列表 元組 字典 字串等等的都不是可迭代物件,當用for迴圈遍歷的時候,其實for先去執行了.iter 方法,將列表 元組 字串等變成乙個可迭代的物件,在進行迭代。iter 下有 n...