可迭代對象通過iter(),轉化為迭代器對象,迭代器可以使用next()訪問,可迭代對象不能直接使用next(); 迭代器是一個可以記住遍歷的位置的對象,所以可以方便的使用next()。 可迭代對象(iterable):凡是具有__iter__的方法的類,都是可迭代的類。可迭代類創建的對象實現了__ ...
可迭代對象通過iter(),轉化為迭代器對象,迭代器可以使用next()訪問,可迭代對象不能直接使用next();
- 迭代器是一個可以記住遍歷的位置的對象,所以可以方便的使用next()。
可迭代對象(iterable):凡是具有__iter__的方法的類,都是可迭代的類。可迭代類創建的對象實現了__iter__方法,因此就是可迭代對象。用list、tuple等容器創建的對象,都是可迭代對象。下麵兩個例子:
Eg1:
my_list = [1, 2, 3]
for item in my_list: # 可迭代對象
print(item) # 輸出:1 2 3
Eg2
for i, item in enumerate([1, 2, 3]): # 迭代器對象
print(f'index: {i}, item: {item}')
enumerate()
是一個內置函數,它可以同時遍歷一個列表的索引和元素。這個函數接受一個可迭代對象作為參數,並返回一個迭代器,該迭代器每次返回一對(索引,元素)。
這裡就產生了一個疑問?為什麼Eg1 for遍歷的是一個iterable,Eg2 for遍歷的是一個iterator?
解答:for迴圈的工作機制:
- 當對象本身就是迭代器時,For迴圈工作機制;
- 調用 __iter__方法,返回自身self,也就是返回迭代器;
- 不斷地調用迭代器的next()方法,每次按序返回迭代器中的一個值;
- 迭代到最後沒有元素時,就拋出異常 StopIteration,這個異常 python 自己會處理,不會暴露給開發者;
- 在可迭代對象中,for迴圈工作機制;
- 先判斷對象是否為可迭代對象(等價於判斷有沒有__iter__或__getitem__方法),沒有的話直接報錯,拋出TypeError異常。有的話,調用 __iter__方法,返回一個迭代器。
- 在python內部不斷地調用迭代器的__next__方法,每次按序返回迭代器中的一個值;
- 迭代到最後沒有元素時,就拋出異常 StopIteration,這個異常 python 自己會處理,不會暴露給開發者。
總結:
For迴圈深層還是對迭代器進行遍歷,只不過會自動的可迭代對象轉換為迭代器。
參考目錄:
Python中的可迭代對象、迭代器、For迴圈工作機制、生成器 - 個人文章 - SegmentFault 思否
Python3 迭代器與生成器 | 菜鳥教程 (runoob.com)