一.初識迭代器
1.認識迭代
迭代是一個重複的過程,每次重複都是基於上次的結果,單純的重複不叫迭代
單純的重複:
while 1:
print(1)
迭代:
count = 1
while count <= 5:
print(count)
count += 1
2.可迭代對象與迭代器對象
1.可迭代對象
可迭代對象:擁有__iter__方法的對象稱爲可迭代對象
可迭代對象調用__iter__會返回一個迭代器對象
2.迭代器對象
迭代器對象:擁有__iter__和__next__方法的對象成爲迭代器對象,迭代器對象也是可迭代對象
迭代器的__next__方法可以取到迭代器的下一個值,如果沒有則會報錯
迭代器的__iter__方法返回它本身(並不是雞肋,爲了統一for循環的工作機制)
示例代碼1:
lst = [1,2,3]
print(lst.__iter__) 結果爲:<method-wrapper '__iter__' of list object at 0x000002988FB59D08>
示例代碼2:
lst = [1,2,3]
item = lst.__iter__() 結果爲:1
print(item.__next__()) 結果爲:2
print(item.__next__()) 結果爲:3
print(item.__next__()) 結果爲:報錯StopIteration:
示例代碼3:
lst = [1,2,3]
item1 = lst.__iter__()
item2 = item1.__iter__()
print(item1 is item2) 結果爲:True
3.爲什麼要有迭代器?
for循環的原理就是迭代器,這裏我們假設不知道for循環
此時,我們如果要對可迭代對象進行迭代取值,代碼應該如下:
lst = [1,2,3]
count = 0
while count < len(lst):
print(lst[count])
count += 1
結果爲:
1
2
3
但是這個方法有一個弊端,就是隻適用於有索引的可迭代對象,對於字典和集合是不管用的,所以python爲我們提供了迭代器,我們可以不依靠索引就能對可迭代對象進行迭代取值
dic = {"a":1,"b":2,"c":3}
item = dic.__iter__()
while 1:
try:
key = item.__next__()
print(key,dic[key])
except StopIteration:
break
結果爲:
a 1
b 2
c 3
二.for循環的原理
for i in k:
print(i)
以這段代碼爲例:
1.執行k.__iter__(),拿到一個迭代器對象
2.調用迭代器對象的__next__方法,獲取到迭代器對象中的一個值
3.重複步驟2,並進行異常捕獲,如果捕獲到異常StopIteration則退出循環
代碼實現:
item = xxx.__iter__()
while 1:
try:
item.__next__()
except StopIteration:
break
三.迭代器優缺點
優點:
- 可以不依靠索引完成對可迭代對象的迭代取值
- 節省內存,因爲__next__方法的存在,執行一次纔會生成一個值。
缺點:
- 不能精準的取值,通過索引取值我們可以準確的取到第幾個元素,但是使用迭代器不可以
- 生命週期短,當迭代器內的值取完後,迭代器就"死"了,如果還想使用,必須得再實例化一個迭代器對象