Python編程:可迭代對象與迭代器(Iterable & Iterator)
前言
在Python編程中,循環處理是不可避免的,這涉及到兩個重要的概念,即可迭代對象和迭代器(Iterable & Iterator)。這個關于迭代的主題,我將分為兩到三篇內容來介紹,以幫助你在實際編程中理解和應用。本文為第一篇。
可迭代對象
可迭代對象(Iterable)是指能夠一次返回一個成員的對象??傻鷮ο蟮睦影ㄋ行蛄蓄愋?如list, str和tuple)和一些非序列類型,如dict,文件對象,以及任何你所定義的類的對象,其實現了__iter__()方法或__getitem__()方法所規定的序列語義——及迭代協議(詳見這里:)。
可迭代對象可以用于for循環和其他需要序列的地方(如zip(),map(),filter()…)。當可迭代對象作為參數傳遞給內置函數iter()時,它將返回該對象的迭代器(iterator)。這個迭代器只適合一組值的一次性遍歷。在使用可迭代對象時,通常不需要調用iter()或自己處理迭代器對象。用for語句自動為來完成這一工作,它創建一個臨時的未命名變量,其用于在循環期間保存迭代器。
簡而言之,可迭代對象是任何實現了__iter__()方法或__getitem__()方法的類對象。
迭代器
迭代器(Iterator)是指表示數據流的對象。反復調用迭代器的__next__()方法(或將其傳遞給內置函數next())將返回流中的連續項。當沒有更多的數據可用時,將引發StopIteration異常。此時,迭代器對象已經耗盡,任何對其__next__()方法的進一步調用都會再次引發StopIteration。迭代器必須具有返回迭代器對象本身的__iter__()方法,因此每個迭代器也是可迭代的(iterable),并且可以在接受其他可迭代對象的大多數地方使用。
簡而言之,迭代器是實現了包含兩個迭代器協議方法__next__()和__iter__()的數據流對象。
一個值得注意的例外是試圖多次迭代的代碼(多次使用同一個迭代器)。容器對象(如列表)每次將其傳遞給iter()函數或在for循環中使用時都會生成一個新的迭代器。使用迭代器嘗試此操作將只返回上一個迭代過程中使用的耗盡的迭代器對象,使其看起來像一個空容器。所以在編寫代碼中要避免這樣的情況出現。
iter函數
另外,需要了解的是內置函數iter() (其在幕后調用__iter__()方法)返回的是一個迭代器對象。所以我們可以說。可迭代對象(iterable)是一個返回迭代器的對象。
為了進一步理解迭代器和可迭代對象,我將后續講解和代碼示例,進一步介紹如下幾點關鍵內容:
- 迭代器協議與循環
- 實現自定義迭代器。