2011年4月15日 星期五

Python -- Iterable

在python裡面有個重要的類別或者說觀念,就是iterable,何謂iterable?也就是本身要提供__iter__()這個方法,他會回傳一個iterator,每個iterator都有個__next__()的方法來取得下個元素
iterator大量使用在for迴圈跟list/set comprenhesion,對於sequence,iterator將會參考到sequence object,然後在__next__()呼叫sequence.__getitem(index),iterator本身只要維護那個index,就可以從0走到len(sequence),逐一取得sequence裡面的元素
而對於類似dict或者set這類的資料型態,就無法保證取出的順序,更有趣的是dict是屬於key/value的pair,那麼__iter__()回傳的是啥?答案是他是一個由dict.keys()產生的iterator,也就是這個iterator每次呼叫__next__()取回的是下一個key
iterator骨子裡面都是包含資料的物件嗎?答案是有例外的,比方說range所產生的iterator,其實他是一個特殊的yeild關鍵字所產生的iterator,他本身只有一個變數,類似C裡面的static,好處是可以這樣的一個物件不用佔用大量的空間,過去range回傳是一個tuple or list,也就是裡面每個元素都是佔有實際記憶體空間的

回頭來看過去for等等的語法格式
for variable in iterable:
suite
list/set的comprehension格式
[item for item in iterable]
這樣就比較瞭解,我們可以把何種物件變成list或者如何用for迴圈去走訪一個物件裡面的元素

另外有些常用的運算如all(), any(), max(), min(), sort(), sum()等等運算可以作用在iterator之上

其實python裡面還有許多方法是對應到operator overloading跟value的assign,瞭解這些方法,會讓programmer更加瞭解python裡面運作的方式,進而寫出更簡潔的code。

同時如果理解許多本來C/C++並不支援的機制,如decorator,就會更加瞭解python與C/C++的差異。所以我說懂得一種程式語言不是一兩個月內的事情,如果一兩個月內可以學會一種語言,大概就是指語法之類的吧!不然此人必定對程式語言設計本身有極高的素養,才可能在短時間內達成,不然大多數人應該只能花更長的時間理解一個程式語言的內含吧

沒有留言: