python學習之-迭代器
什麼是迭代器
什麼是迭代:迭代就是一個重複的過程,但是每一次重複都是基於上一次的結果而進行的
迭代器就是用來迭代取值的工具
迭代器的優點:
1、提供了一種可以不依賴索引的迭代取值方式
2、迭代器就是一個功能,對於記憶體只佔自身程式碼需要的記憶體空間,幾乎不佔用記憶體空間
迭代器的缺點:
1、迭代器是一次性的,只能往後一直取,無法在最開始的時候預知迭代器中的值包含的格式
2、無法取到指定的值,不如按照索引取值或者key的取值方式靈活
單純的重複不是迭代
while True:
print(1)
PS:這個不是迭代,只滿足了迭代的一個特點就是重複,每一次的迴圈都是新的開始,和上一次的迴圈毫無關聯,迭代必須是和上一次的迴圈有關聯的
迭代的過程
l=['a','b','c']
i=0
while i < len(l):
print(l[i])
i+=1
PS:這個就是迭代的過程,但是這個只是用一個迴圈加功能實現迭代的過程,但這個不是迭代器
可迭代的物件:但凡內建有__iter__的物件就是可迭代的物件
' '.__iter__() #字串型別
[].__iter__() #列表型別
(1,2).__iter__() #元祖型別
{'x':1}.__iter__() #字典型別
{1,2,3}.__iter__() #集合型別
open('file').__iter__() #檔案型別
PS:呼叫可迭代物件的__iter__方法會得到一個返回值,該返回值就是迭代器物件
迭代器物件:即內建有__iter__方法又有__next__方法
直接檢視型別下面有沒有__next__方法,有的就是迭代器物件
PS:檔案物件本身就是迭代器物件,為什麼python要這樣做,因為檔案極有可能儲存的內容很多,所以python直接將檔案做成看迭代器物件
迭代器的使用方法
使用示例
dic={'x':1,'y':2,'z':3}
iter_dic=dic.__iter__() # 用iter方法將字典變成可迭代物件放入變數
print(iter_dic) #列印這個變數就可以得到一個提示,這是一個關於字典的迭代器
print(iter_dic.__next__()) #迭代器取值,用迭代器下面的next方法得到值,每執行一次只會得到一個值
使用方法
dic={'x':1,'y':2,'z':3}
iter_dic=iter()
print(next(iter_dic)
PS:迭代器取不到值也就是取值結束會報一個錯誤StopIteration
PS:python中的內建方法都可以有簡寫方式因為python已經將內建方法封裝好了,dice.__iter__()可以寫成iter(dice),iter_dic.__next__()可以簡寫成next(iter_dic)
迭代器的使用例項
dic={'x':1,'y':2,'z':3}
iter_dic=iter(dic)
while True:
try:
print(next(iter_dic))
except StopIteration:
break
print('='*100) #這裡後面的程式碼就是一個迴圈下連續取值,所以第二次的取值是取不到值得,因為迭代器的特性
iter_dic=iter(dic)
while True:
try:
print(next(iter_dic))
except StopIteration:
break
PS:利用異常處理排除迭代器結束後的報錯
for迴圈就是迭代器迴圈,for迴圈的原理就是基於迭代器
for迴圈的底層工作原理:
1、呼叫in後面那物件的內建方法__iter__,拿到一個迭代器物件iter_obj
2、執行k=next(iter_obj),迴圈往復直到丟擲異常StopIterration
3、for迴圈在底層會捕捉異常然後結束迴圈(所以for迴圈取不到值得時候不會報錯)
PS:可迭代物件和迭代器物件下面都有iter方法,為什麼python要這樣設計,就是為了統一for迴圈的工作機制,因為for迴圈的原理就是先呼叫一個值下面的iter方法將值變成可迭代物件,然後呼叫下面的next方法進行迭代,由於迭代器本身就是可迭代物件,所以迭代器下面的iter方法返回的就是迭代器本身,這樣做就不用設計for迴圈的兩套機制原理了,直接將機制原理做了統一