你有一個list,你想依序一次取出一個元素;
你有一個string, 你想依序一次取出一個字元;
你有一個tuple of tuple,你想依序一次取出一個tuple
你有一個dict,你想一次取出一對(key, value)
你有一個文本的file object,你想一次取出一行;

Iterable

可迭代對象。讓我們先看看Python3官方文件Glossary中Iterable條目的內容:

Iterable (可迭代物件)

iterable(可迭代物件)是一種能夠一次回傳一個成員的物件。所有sequence類別的物件(例如list, str, tuple)和一些 non-sequence類別的物件(例如dict, file objects)都是iterable物件。另外,任何定義有__iter__()方法或者__getitem__()方法的class,實例化後的物件也算是iterable。

Sequence: 定義有__getitem__()方法(可透過整數索引來存取其成員)和 __len__()方法(回傳sequence長度)的物件。

Iterables可以用在for迴圈和一些需要 sequence 的函數中(例如zip(), map()等等). 當iterable作為內建函數iter()的參數時,該函數會回傳該iterable的 iterator(迭代器)。Iterator可用來將包含一組值的集合拆開,一次取出其中一個值。在使用iterable,使用者通常不必自己呼叫__iter__()來產生iterator. Python中的 for 陳述式已經幫你把事情都處理好了:當你把一個iterable丟給for...in...時(例如for i in [1, 2, 3, 4, 5]),在執行迴圈時,會自動幫你產生一個iterator,並把該iterator賦予一個暫時的未命名變數。

iterable和iterator是用來稱呼同一件事的不同構成要素:可以把iterable想像成有待分配的素材,像是一籃裝有20顆籃球的籃子,籃子中的每一顆籃球都是籃子中的一份子。現在想把籃球發給班上20個人,但籃球不會自己長出腳來走到每個人的腳邊,因此需要指派體育股長,讓他一次從籃子中取出一顆籃球發給每個人,迭代器 (iterator)扮演的角色就如同體育股長一樣,每次從iterable中取出一個成員。

常見做法

Often the iterable classes will implement both iter() and next() in the same class, and have iter() return self, which makes the iterable class both an iterable and its own iterator. It’s perfectly fine to return a different object as the iterator, though.

能產生各種iterator的強大工具itertools

參考資料

留言與分享

  • 第 1 頁 共 1 頁
作者的圖片

puerdon

學習筆記 / 資源整理 / 雜物堆放


語言學研究