容器:把多個元素組織在一起的資料結構。List/dict/set/tuples….都是容器對象
大多數容器提供某種方式擷取擷取每一個元素,而是可疊代對象(iterable)賦予了容器這種能力,當然并不是所有的容器都是可疊代的。疊代器内部持有一個狀态,該狀态用于記錄目前疊代所在的位置,以友善下次疊代的時候擷取正确的元素。疊代器有一種具體的疊代器類型,比如list_iterator,set_iterator。
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> x = [1, 2, 3] >>> y = iter(x) >>> z = iter(x) >>> next(y) >>> next(z) >>> type(x) <class 'list'> >>> type(y) <class 'list_iterator'> |
這裡x是一個可疊代對象,y和z是兩個獨立的疊代器(iterator)
,可疊代對象實作了__iter__方法,該方法傳回一個疊代器對象。
Fib既是一個可疊代對象(因為它實作了__iter__方法),又是一個疊代器(因為實作了__next__方法)
任何實作了
__iter__
和
__next__()
(python2中
next()
)方法的對象都是疊代器,
__iter__
傳回疊代器自身,
__next__
傳回容器中的下一個值,如
生成器其實是一種特殊的疊代器,它不需要再像上面的類一樣寫__iter__()和__next__()方法.函數有yield關鍵字就是生成器。
生成器是一種特殊的疊代器,它的傳回值不是通過return而是用yield。
本文來自部落格園,作者:Iving,轉載請注明原文連結:https://www.cnblogs.com/SAS-T/p/9397938.html