1. 程式人生 > >《Python學習之路 -- Python基礎之叠代器及for循環工作原理》

《Python學習之路 -- Python基礎之叠代器及for循環工作原理》

pre 循環 next 是我 我們 png 捕獲 模擬 檢查

  提到叠代器不得不說叠代器協議,叠代器協議是指:對象必須提供一個__next__()方法,執行該方法要麽返回叠代中的下一項,要麽就拋出一個StopIteration異常(相當於報錯的意思)以終止叠代。然而遵循這個協議的對象就稱為可叠代對象,又稱為叠代器。在Python中,for循環操作的對象就是可叠代對象。說到這裏可能會引起一些誤會,原因就是我們都知道for循環可以直接遍歷列表、元組或字符串等等集合,但是這些數據類型並沒有上面提到的__next__()方法,也就是說這些數據類型根本就不遵循叠代器協議,也就意味著列表、元組、字符串或字典等都不是可叠代對象,那麽for循環究竟是如何工作的呢?

  首先,驗證剛剛說的列表或字符串等等都不是可叠代對象:

技術分享圖片

那麽問題來了,為什麽說 for 循環操作的是可叠代對象,然而這些數據類型又不是可叠代對象,那為什麽 for 循環能夠操作他們呢?下面就來介紹 for 循環的工作原理:

其實,for 循環在處理這些數據前,會調用 __iter__() 方法,將這些數據轉化為一個可叠代對象,然後調用可叠代對象的 __next__() 方法,並捕獲StopIteration異常,也就實現了遍歷完所有數據就會結束,並不會拋出這個異常。

# 利用while循環模擬for循環
num_list = [1,2,3,4]
# 先調用數據的__iter__()方法,生成一個可叠代對象
list_iterable = num_list.__iter__
() # 檢查可叠代對象的類型,返回 <class ‘list_iterator‘> 列表叠代器 print(type(list_iterable)) # 調用可叠代對象的__next__()方法實現遍歷,並捕獲StopIteration異常 while True: try: print(list_iterable.__next__()) # 遍歷列表中的所有元素 --- 1 2 3 4 except StopIteration: break

《Python學習之路 -- Python基礎之叠代器及for循環工作原理》