關於迭代器的一些總結

2022-04-04 07:17:41 字數 2668 閱讀 8633

在進行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

>>> 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

以上表示,range生成的是乙個列表,而xrange則是乙個迭代器,從而在使用for迴圈的時候,range占用大量的記憶體,而xrange則是在迴圈的時候才得到值,從而比較節省記憶體,如下所示:

>>> 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....