迭代器是乙個可以記住遍歷的位置的物件。
迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
可以使用 hasattr()判斷物件是否是「可迭代的」
>>
>
hasattr
(str
,'__iter__'
)true
使用內建函式 iter 定義迭代器物件。
>>
> lst=[1
,2,3
,4]>>
> iter_lst=
iter
(lst)
>>
> iter_lst
>
從返回結果看,iter_lst引用的是迭代器物件,那麼那麼iter_lst 和 lst這兩個物件有什麼異同點呢?
>>
>
hasattr
(lst,
"__iter__"
)true
>>
>
hasattr
(iter_lst,
"__iter__"
)true
相同點:都有"__iter__"
說明2著都是可迭代的
>>
>
hasattr
(lst,
"__next__"
)false
>>
>
hasattr
(iter_lst,
"__next__"
)true
不同點:迭代器物件必須有"__next__"
方法。
>>
> iter_lst.__next__()1
>>
> iter_lst.__next__()2
.>>
> iter_lst.__next__()3
>>
> iter_lst.__next__()4
>>
> iter_lst.__next__(
)traceback (most recent call last)
: file ""
, line 1,in
iter_lst.__next__(
)stopiteration
每執行一次__next__
方法,迭代器就有乙個蒜素被讀入記憶體。列表則是一次性被讀入記憶體。這說明迭代器iter_lst比列表lst節省了記憶體,所以你懂得。對於元素數量很大或者每個元素比較大的物件,迭代器就很有優勢了。
當迴圈到最後乙個元素,在執行__next__
方法,會丟擲stopiteration
異常。
>>
>
for i in iter_lst:
print
(i)>>
>
如果承接前面的操作,對iter_lst使用for迴圈,則不會丟擲異常(for迴圈語句會自動捕捉並處理stopiteration異常),但是也沒有列印出內容,這是因為迭代器迴圈到最後乙個物件後,不會自動回到最開始。
為了方便理解,可以假設有乙個「指標」,當這個指標指到**,**的元素就被讀取。每次執行__next__
方法時就是「指標」指向後乙個元素的位置,永遠也指不到當前元素,所以不執行。
>>
> iter_lst =
iter
(lst)
>>
>
for i in iter_lst:
print
(i)123
4
在python中有乙個與迭代器物件類似的內建方法next,它的作用就是返回迭代器物件中指標位置的元素,並向後移動。
>>
>
next
(iter_lst)
#承接前面的操作,所以報異常。
traceback (most recent call last)
: file ""
, line 1,in
next
(iter_lst)
stopiteration
>>
> iter_lst =
iter
(lst)
>>
>
next
(iter_lst)
1>>
>
next
(iter_lst)
2>>
>
參考資料《python大學實用教程》 Python入門之迭代器
可迭代物件 iterable 可以直接作用於for迴圈的物件統稱為可迭代物件 使用isinstance 判斷乙個物件是否是iterable物件 from collections import iterable isinstance iterable true isinstance iterable ...
python基礎入門 迭代器
迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...
python 迭代器 python迭代器
迭代器 可以直接作用for迴圈的資料型別 我們已經知道,可以直接作用for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function 可迭代物件定義 這些可以直接作用fo...