python中的三大器有迭代器,生成器,裝飾器,本文重點講解下迭代器的概念,使用,自定義迭代器等的介紹。
1.概念:
迭代器是乙個物件,乙個可以記住遍歷位置的物件,迭代器物件從集合的第乙個元素開始訪問,直到所有元素被訪問完結束,迭代器只能往前,不能後退,實質是具備了__next__和__iter__方法的物件
2.可迭代物件:
可以通過for in 等類似操作進行遍歷取值的物件,本質是具備了__iter__方法的物件,因為__iter__方法提供了迭代器,實現了遍歷位置的記錄。在迭代乙個可迭代物件的時候,實際上就是先獲取該物件提供的乙個迭代器,然後通過這個迭代器來依次獲取物件中的每乙個資料。
3.**實現:
3.1通過isinstance()判斷
in [1]: from collections importiterable
in [2]: isinstance({},iterable)
out[2]: true
in [3]: isinstance((),iterable)
out[3]: true
in [4]: isinstance(""
,iterable)
out[4]: true
in [5]: for item in
{}: ...:
pass
...:
in [6]: for item in"":
...:
pass
...:
in [7]: for item in
(): ...:
pass
...:
3.2 for in的本質
就是先通過iter()函式獲取可迭代物件iterable的迭代器,然後對獲取到的迭代器不斷呼叫next()方法來獲取下乙個值並將其賦值給item,當遇到stopiteration的異常後迴圈結束。
li = [100, 200, 300, 400]#for num in li:
#print(num)
#1. 通過呼叫可迭代物件的__iter__()獲取迭代器
#2. 對迭代器呼叫__next__進行迭代操作,
#如果沒有丟擲stopiteration異常,表示迭代沒有結束,把獲取到的資料元素放到變數中
#如果丟擲了異常,表示迭代結束,退出執行
#3. 執行迴圈體
#4. 跳轉到第2步執行
iterator = li.__iter__
()while
true:
try:
num = iterator.__next__
()
except
stopiteration:
break
else
:
print(num)
3.3 自定義迭代器
classmyiterable(object):
def__init__
(self):
self.container = #
定義乙個容器
defadd(self, item):
def__iter__
(self):
return iterator(self.container) #
返回乙個迭代器
class
iterator(object):
def__init__
(self, container):
self.container =container
self.i =0
def__next__
(self):
if self.i count =self.i
self.i += 1
return
self.container[count]
else
:
raise
stopiteration
def__iter__
(self):
pass
mi =myiterable()
it = mi.__iter__
()mi.add(1)
mi.add(2)
mi.add(3)
for item in
mi:
(item)
from collections import
iterator
print(isinstance(it, iterator))
3.4 合併迭代器
python要求定義的迭代器必須實現__iter__(self),並且返回self。通常,乙個可迭代物件的迭代器都是固定的,並且,類與類
之間需要距離性,物件之間需要相似性,所以通常可迭代物件和迭代器寫在一起,就是下面的。
classmyiterable(object):
def__init__
(self):
self.container =
self.i =0
defadd(self, item):
def__next__
(self):
if self.i count =self.i
self.i += 1
return
self.container[count]
else
:
raise
stopiteration
def__iter__
(self):
return
self
mi =myiterable()
mi.add(1)
mi.add(2)
mi.add(3)
for item in
mi:
print(item)
3.5 迭代器應用場景之實現菲波那切數列
我們發現迭代器最核心的功能就是可以通過next()函式的呼叫來返回下乙個資料值。如果每次返回的資料值不是在乙個已有的資料集合中讀取的,而是通過程式按照一定的規律計算生成的,那麼也就意味著可以不用再依賴乙個已有的資料集合,也就是說不用再將所有要迭代的資料都一次性快取下來供後續依次讀取,這樣可以節省大量的儲存(記憶體)空間。
classfib(object):
def__init__
(self, num):
self.num =num
self.num1 =0
self.num2 = 1self.i =0
def__next__
(self):
if self.i self.i += 1temp =self.num1
self.num1, self.num2 = self.num2, self.num1 +self.num2
return
temp
else
:
raise
stopiteration
def__iter__
(self):
return
self
fib = fib(7)
print(list(fib))
4.iter()函式與next()函式
對於可迭代物件,我們可以通過iter()函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使用next()函式來獲取下一條資料。iter()函式實際上就是呼叫了可迭代物件的__iter__
方法。
>> li = [1,2,3]>>> li_iter =iter(li)
>>>next(li_iter)
1>>>next(li_iter)
2>>>next(li_iter)
3>>>next(li_iter)
traceback (most recent call last):
file
"", line 1, in
stopiteration
>>>
python 迭代器 筆記
1.凡事可用於for迴圈的物件都是iterable型別物件 2.凡事可做用於next 函式的物件都是iterator型別物件,他們表示乙個惰性計算的序列 3.集合資料型別list dicr str等是iterable物件不是iterator物件,但是可以通過呼叫iter 函式獲得乙個iterator...
Python筆記 迭代器
我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable。1 可以...
python迭代器筆記
迭代器的優點 迭代器訪問與for迴圈訪問非常相似,但是也有不同之處。對於支援隨機訪問的資料結構如元組和列表,迭代器並無優勢。因為迭代器在訪問的時候會丟失資料索引值,但是如果遇到無法隨機訪問的資料結構如集合時,迭代器是唯一訪問元素的方式 迭代器僅僅在訪問到某個元素時才使用該元素。在這之前,元素可以不存...