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