關於這兩幾個概念,前後看了很多次,終於有些明白了,在這裡做個總結!
__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...