一、什么是迭代器iterator
迭代器指的是迭代取值的工具,迭代是一個重復的程序,每次重復都是基于上一次的結果而繼續的,單純的重復并不是迭代
可迭代物件:可以轉換成迭代器的物件,內置有__iter__方法的都是可迭代物件,
呼叫可迭代物件下的__iter__方法就可以將其轉換為迭代器物件,然后就可以迭代取值啦~
迭代器取值 通過執行 迭代器的 __next__()方法就可以啦~
迭代器中多有的值都取完之后,在執行__next__()方法就會拋出StopIteration例外,
自定義的迭代器,就是生成器,它彌補了只能用__iter__轉換可迭代物件生成迭代器的不足,迭代器本身是節省記憶體空間,但是用__iter__方法,需要先有占用記憶體的可迭代物件,所以自定義迭代器是很好的選擇,
二、為何有迭代器
迭代器是用來迭代取值的工具,而涉及到把多個值回圈取出來的型別有:串列,字串,元祖,字典,集合,打開檔案,
串列,字串,元祖可以使用索引迭代取值,字典,集合,檔案不行,
python必須提供一種能夠不依賴于索引的取值方式,這就是迭代器,
for 回圈的作業原理
1.呼叫物件的__iter__方法,得到一個迭代器物件
2.呼叫迭代器物件的__next__方法,拿到回傳值
3.回圈步驟2,直到拋出StopIteration例外,for回圈會捕捉例外并結束回圈,
迭代器的優缺點
1.獲得了統一的迭代取值的方案
2.迭代器節省記憶體,同一時間在記憶體里只有一個值,next呼叫一次才有一個值
3.不能像索引一樣,想去哪個值,就取哪個,必須要一個個next
4.迭代器有生命周期,取完值后就再取不到了
5.除非取進,否則無法獲取迭代器的長度
三、如何自定義迭代器(如何定義生成器generator)
在函式內一旦存在yield關鍵字,呼叫函式并不會執行函式體代碼,會回傳一個生成器物件,就是一個自定義的迭代器,
def func():
#return ----> 碰到就結束
#yield ----> 碰到后,在這停住
print('第一次‘)
yield 1
print('第二次‘)
yield 1
print('第三次‘)
yield 1
g = func() # 呼叫函式 回傳一個生成器物件
g.__iter__()
res1 = g.__next__() # 呼叫next方法,會觸發函式體代碼的運行,然后遇到yield停下來,將yield后的值當做本次呼叫的結果回傳,res1 =1
res2 = g.__next__() # 再次呼叫next方法,接著往下走,res2 = 2,直到值取完之后,拋出例外,也可以用next()內置方法,iter()內置方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/73448.html
標籤:Python
上一篇:無頭瀏覽器
