對于如下的for語句
for obj in iterable_obj: do something with obj首先會調用iter方法獲取關于iterable_obj對象的迭代器,然后不斷調用迭代器對象的next方法,直至拋出異常位置。為了說明這一點,看下面的例子。
myiter = MyIterator(1, 4)for i in myiter: passPRint myiter.next()上面代碼會拋出StopIteration異常。因為在for語句階段會將myiter迭代器對象的元素全部讀完。MyIterator類的定義參見博文。
到目前位置,我們有三種方式表示一個序列。它們是集合,序列對象和迭代器對象。
集合(如列表,元組,字符串等)中的元素可讀可寫。當然不同的集合類型,可寫的權限有所不同。例如列表中的元素可以隨意添加,刪除,修改。而元組中的元素雖然不能添加、刪除和修改,但是我們可以對兩個元組對象進行連接。當然,連接后會創建新的元組對象。序列對象中的元素可讀但不可寫。在基本的定義中,兩個序列對象也不必支持元組對象那樣的連接操作。這樣的好處是,在有的情況下,我們不必開辟專門的內存空間保存序列對象中的所有元素。迭代器對象中的元素也是可讀不可寫的。但是,迭代器對讀的權限做了一個限制,就是只能從頭至尾讀一遍。迭代器對象的優勢在于它有的時候比序列對象更加靈活。通常情況下,序列對象中的元素順序是不能變的。而對于迭代器對象來說,我們只需要指定不同的next方法,就能實現不同的讀取順序。一個比較經典的例子,就是我們可以實現一個迭代器類,同時支持樹的深度優先和廣度優先遍歷。顯然用迭代器實現這個功能比用序列來實現要簡單許多。
新聞熱點
疑難解答