可迭代物件通過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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541244.html
標籤:其他
