在進行for迴圈的時候,會碰到兩個名詞:乙個是可迭代的物件iterable,乙個是迭代器iterator。
可迭代的物件有很多,例如sequence中的string,list,tuple,還有字典dict,檔案file等,在可迭代的物件中,主要是實現了__iter__()方法,從而使可迭代的。
迭代器iterator,在其中主要實現了方法__iter__()方法,和next()方法,所謂的迭代器也就是指具有next()方法的物件。在迭代器中的__iter__方法返回了乙個可迭代的物件,當乙個迭代器具有next方法的時候,那麼就可以返回其自身,也就是return self。
可迭代的物件,也可以理解為可以使用for進行迴圈的物件。
迭代器是乙個物件,迭代器的限制在於不能進行複製,不能從頭開始。
判斷乙個型別是否是可以迭代的,可以使用isinstance方法,如下所示:
>>> from collections import iterable>>> isinstance(list(),iterable)
true
>>> isinstance('kel',iterable)
true
>>> isinstance(tuple(),iterable)
true
>>> isinstance(dict(),iterable)
true
建立迭代器主要使用以下方法:
iter(obj)在進行建立的時候,會檢視obj是否是可迭代的,如果是可迭代的,那麼將返回乙個迭代器。
迭代的過程如下:
使用for迴圈來進行遍歷——》根據next得到下乙個值——》到達最後的時候觸發異常stopiteration——》for迴圈捕獲異常——》迴圈結束
在迭代器中,只能夠迭代一次,而在可迭代物件中,可以無限迭代,從而可以將資料和迭代進行分離,將資料儲存在乙個地方,將迭代器儲存在另外乙個地方,從而形成無限迭代,如下所示:
class data(object): #用來儲存資料的類def __init__(self,*args):
self.data = tuple(args)
def __iter__(self): #可迭代的主要實現方法__iter__(self)方法
return dataiterable(self)
class dataiterable(object): #迭代器的類
def __init__(self,data):
self.data = data.data #注意初始化的時候,傳遞是是乙個data的例項,從而需要得到data的屬性
self.index = 0
def __iter__(self): #迭代器直接返回自身,也就是返回具有next函式的迭代器的類
return self
def next(self): #迭代器的主要方法next,不具有引數
if self.index == len(self.data): #遍歷完所有的資料之後,丟擲stopiteration的異常
raise stopiteration
else:
data = self.data[self.index]
self.index += 1
return data
if __name__ == '__main__':
data = data(1,'kel','xyz',4.56)
for values in data: #可以進行無限迭代
print values
for values in data: #第二次迭代
print values
內建的迭代器的函式:
1、 reversed()返回乙個倒序的可迭代的物件
2、 enumerate()返回乙個帶有下標的迭代器
3、any()返回真當任何乙個bool(x)為真
4、 all()返回真當所有的bool(x)為真
迭代器的真正好處在於只有在for迴圈的時候才計算得到的值,例如range函式和xrange函式:
>>> from collections import iterable以上表示,range生成的是乙個列表,而xrange則是乙個迭代器,從而在使用for迴圈的時候,range占用大量的記憶體,而xrange則是在迴圈的時候才得到值,從而比較節省記憶體,如下所示:>>> isinstance(range(1),iterable)
true
>>> isinstance(range(1),list)
true
>>> isinstance(xrange(1),iterable)
true
>>> isinstance(xrange(1),list)
false
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> xrange(10)
xrange(10
>>> import sys>>> sys.getsizeof(range(10000))
80072
>>> sys.getsizeof(xrange(10000)) #可以看到xrange占用的記憶體很小,從而使用迭代器更加具有效率
40
關於迭代器一些題
string iterator p 乙個正常的迭代器,可 可解引用 string const iterator cp 可 不可解引用 const string s abcde s物件為乙個const物件,不可修改 1.p s.begin 錯誤,s物件是乙個const修飾的string類物件,所以s....
集合 迭代器的一些總結
map isempty 如果map未包含鍵 值對映關係,則返回 true get object key 根據鍵獲取值,如果鍵為空 返回null put key,value 在map中建立鍵 值關係,如果map中存在該鍵,則新值替換舊值 values 返回值為collection的包含map值的檢視 ...
c 關於迭代器的一些認識
眾所週之當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作 view plaincopy to clipboardprint?iter vec....