Python學習之迭代器協議
迭代(iteration)
逐個獲取元素的過程,就是「迭代」。
例如:
# iteration
# 用 for 迴圈迭代序列
a_list = [1, 2, 3]
for i in a_list:
print(i)
可迭代(iterable)
實現了方法 __iter__
的物件是可迭代的。
如果你暫時聽不懂,那可以簡單地理解為:如果我們可以從一個物件中逐個地獲取元素,那麼我們就說這個物件是「可迭代」的。
Python 中的順序型別,都是可迭代的,例如 list
、 tuple
,、string
;另外 dict
、set
、 file
也是可迭代的。
迭代器(iterator)
實現了方法 __next__
的物件是迭代器。
當你呼叫方法 __next__
(可不提供任何引數)時,迭代器應返回下一個值。如果迭代器沒有可供返回的值,應引發 StopIteration 異常。
你還可使用內建的便利函式 next
,在這種情況下,next(it)
與 it.__next__()
等效。
迭代器協議(iterator protocol)
迭代器協議指的是容器類需要包含一個特殊方法,這個特殊方法就是 __iter__()
方法。
如果一個容器類提供了 __iter__()
方法,並且該方法能返回一個能夠逐個訪問容器內所有元素的迭代器,則我們說該容器類實現了迭代器協議。
迭代器協議與 for 迴圈
講這個例子,是為了更好地理解迭代器協議。
# iterator protocol and for loop
for x in something:
print(x)
Python 處理 for
迴圈時,首先會呼叫 something.__iter__()
,返回 something
對應的迭代器(假設叫 it
);而後,for
迴圈會呼叫 it.__next__()
,獲取迭代器的下一個元素,並賦值給 x
,然後執行迴圈體;執行完後,for
迴圈會繼續呼叫 it.__next__()
,獲取迭代器的下一個元素,並賦值給 x
,執行迴圈體 …… 當 for
迴圈呼叫 it.__next__()
產生 StopIteration
異常時,迴圈結束。
我們們可以用下面的程式碼模擬一下:
>>> a_list = [1,2,3,4]
>>> it = a_list.__iter__() # 獲取迭代器
>>> it.__next__() # 讓迭代器返回下一個值
1
>>> it.__next__()
2
>>> it.__next__()
3
>>> it.__next__()
4
>>> it.__next__() # 迭代器沒有可供返回的值,引發 StopIteration 異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
參考資料
【1】《Python基礎教程》(人民郵電出版社,第3版)
相關文章
- 從迭代器模式到迭代協議模式協議
- Python學習迭代器(Iterator)Python
- ES6系列--7. 可迭代協議和迭代器協議協議
- Python學習筆記|Python之索引迭代Python筆記索引
- 機器學習之迭代方法機器學習
- Python 擴充之迭代器Python
- ES6 迭代協議協議
- Python之可迭代物件、迭代器、生成器Python物件
- Python學習筆記 - 迭代器和生成器Python筆記
- Python學習之路34-迭代器和生成器Python
- 【機器學習】--Python機器學習庫之Numpy機器學習Python
- TCP/IP學習筆記之協議和郵件TCP筆記協議
- 計算機網路學習筆記(10) TCP/IP協議棧 之TELNET協議計算機網路筆記TCP協議
- 迭代協議與生成器 101協議
- 協程與迭代器
- Python迭代器Python
- Python 迭代器Python
- 學習筆記 - DNS協議筆記DNS協議
- IP協議學習筆記協議筆記
- BGP路由協議學習一路由協議
- Raft協議學習筆記Raft協議筆記
- Raft 協議學習筆記Raft協議筆記
- Python學習之三大名器-裝飾器、迭代器、生成器Python
- Linux學習之常用的遠端管理協議有哪些?Linux協議
- C++中cbegin迭代器學習C++
- 迭代器和生成器區別是什麼?Python學習!Python
- Python零基礎學習筆記(二十三)——迭代器Python筆記
- Python之裝飾器、迭代器和生成器Python
- WEB伺服器之HTTP協議Web伺服器HTTP協議
- Python進階:迭代器與迭代器切片Python
- 使用生成器 --實現迭代協議協議
- Python學習之路30-介面:從協議到抽象基類Python協議抽象
- OAuth 2.0 協議學習筆記OAuth協議筆記
- Internet安全協議 學習筆記協議筆記
- 使用wireshark學習網路協議協議
- ESP32藍芽學習--GATT協議學習藍芽協議
- javascript 之迭代器JavaScript
- Python可迭代的物件與迭代器Python物件