迭代器即用來迭代取值的工具,而迭代是重複反饋過程的活動,其目的通常是為了逼近所需的目標或結果,每一次對過程的重複稱為一次「迭代」,而每一次迭代得到的結果會作為下一次迭代的初始值,單純的重複並不是迭代。
例項:
goods=['mac','
lenovo
','acer
','dell
','sony']
index=0
while index print
(goods[index])
index+=1
通過索引的方式進行迭代取值,實現簡單,但僅適用於序列型別:字串,列表,元組。對於沒有索引的字典、集合等非序列型別,必須找到一種不依賴索引來進行迭代取值的方式,這就用到了迭代器。
可迭代物件(iterable): 但凡內建有__iter__方法的都稱之為可迭代物件。字串、列表、元組、字典、集合、開啟的檔案都是可迭代物件:
''.__iter__().__iter__
()().
__iter__
(){}.
__iter__
()dict({}).
__iter__
()open(
'a.txt
').__iter__()
呼叫obj.iter()方法返回的結果就是乙個迭代器物件(iterator)。迭代器物件是內建有iter和next方法的物件,開啟的檔案本身就是乙個迭代器物件,執行迭代器物件.iter()方法得到的仍然是迭代器本身,而執行迭代器.next()方法就會計算出迭代器中的下乙個值。 迭代器是python提供的一種統一的、不依賴於索引的迭代取值方式,只要存在多個「值」,無論序列型別還是非序列型別都可以按照迭代器的方式取值
#呼叫可迭代物件下的__iter__方法會將其轉換成迭代器物件
d =
#d_iterator = d.__iter__()
d_iterator =iter(d)
(d_iterator)
#print(d_iterator.__next__())
#print(d_iterator.__next__())
#print(d_iterator.__next__())
#print(d_iterator.__next__()) # 丟擲異常stopiteration
#可迭代物件與迭代器詳解
#可迭代物件("可以轉換成迭代器的物件"): 內建有__iter__方法的物件
#迭代器物件: 內建有__next__方便並且內建有__iter__方法的物件
#迭代器物件.__next__(): 得到迭代器的下乙個值
#迭代器物件.__iter__(): 得到迭代器的本身
#迭代器物件是可迭代物件, 可迭代物件不是迭代器物件
dic =
dic_iterator = dic.__iter__
()print(dic_iterator.__iter__() is dic_iterator) #
true
可迭代物件: 字串、元組、列表、集合、字典、檔案物件迭代器物件: 檔案物件
#1. d.__iter__()得到乙個迭代器物件
#2. 迭代器物件.__next__()拿到第乙個返回值, 返回將該返回值賦值給k
#3. 迴圈往復步驟2, 直到丟擲stopiteration異常for迴圈會捕捉異常然後結束迴圈
優點:
1. 為序列和非序列型別提供了一種統一的迭代取值方式。
2. 惰性計算:迭代器物件表示的是乙個資料流,可以只在需要時才去呼叫next來計算出乙個值,就迭代器本身來說,同一時刻在記憶體中只有乙個值,因而可以存放無限大的資料流,而對於其他容器型別,如列表,需要把所有的元素都存放於記憶體中,受記憶體大小的限制,可以存放的值的個數是有限的。
缺點:
1. 除非取盡,否則無法獲取迭代器的長度
2. 只能取下乙個值,不能回到開始,更像是『一次性的』,迭代器產生後的唯一目標就是重複執行next方法直到值取盡,否則就會停留在某個位置,等待下一次呼叫next;若是要再次迭代同個物件,你只能重新呼叫iter方法去建立乙個新的迭代器物件,如果有兩個或者多個迴圈使用同乙個迭代器,必然只會有乙個迴圈能取到值。
Python基礎之迭代器
一喪 別害怕,反正都會後悔的 認識迭代器一定要認識乙個單詞yield。yield是什麼意思?在筆者認為它就是乙個暫停並輸出的意思,當再次呼叫時從暫停處繼續執行 到達下乙個暫停並輸出。我們來看乙個簡單的 吧。def shuchu num for n in range num yield n f shu...
python基礎之迭代器生成裝飾器
容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中 也有一些特例,並不是所有的元素都放在記憶體,比如迭代器和生成器物件 在python中,常見的容器物件有 容器比較容易理解,因為...
Python基礎 迭代器
二 生成器 三 推導表示式 迭代器就是乙個容器,將可迭代物件通過iter包起來 li 1 2,3 4,5 a liter li 迭代器print next a 1print next a 2print next a 3 乙個個取值 1.訪問者不需要去關心內部結構,只需要通過next不斷去取下乙個內容...