1. 程式人生 > >python學習之-迭代器

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迴圈的兩套機制原理了,直接將機制原理做了統一