1. 程式人生 > >Python小白學習之路(二十一)—【迭代器】

Python小白學習之路(二十一)—【迭代器】

迭代器

1.迭代器協議


物件必須提供一個 next 方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個Stoplteration異常,以終止迭代(只能往後走不能往前退)


2.可迭代物件

實現了迭代器協議的物件(如何實現:物件內部定義一個_iter_()方法)

協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如 for迴圈,sum,min,max函式等)使用迭代器協議訪問物件

3.關於for迴圈機制

for迴圈的本質:迴圈所有物件,全都是使用迭代器協議

思考:for 迴圈的本質是遵循迭代器協議去訪問物件,那麼for迴圈的物件肯定都是迭代器。那麼既然這樣,for迴圈可以遍歷(字串、列表、元祖、字典、集合、
檔案物件),那麼這些型別的資料肯定都是可迭代物件。但是我們發現,定義了一個字串 S = ‘xhg’,卻發現S.next()方法,違背了迭代器協議。所以不是
迭代物件。

從不同角度分析問題,得出了不同的結論。要想了解具體怎麼回事,需要知道for迴圈內部做了些什麼事情

結論:(字串、列表、元祖、字典、集合、檔案物件)這些都不是可迭代物件,只不過在for迴圈時,
呼叫了他們內部的 _iter_() 方法,把他們變成了可迭代物件,然後for迴圈呼叫可迭代物件的 _next_()
方法去取值,而且for迴圈會捕捉Stoplteration異常,以終止迭代

f = [1, 2, 3, 4, 5]
for i in f:
  print(i)
#分析
第一步:iter_f = f.__iter__() #呼叫了他們內部的 _iter_() 方法,把他們變成了可迭代物件,遵循可迭代協議
第二步:iter_f.__next__() #呼叫可迭代物件 iter_f 的 __next__() 方法進行取值

 

#for迴圈內部等同於做了以下程式碼的作用:

f = [1, 2, 3, 4, 5]
iter_f = f.__iter__()
print(iter_f)
print(iter_f.__next__())
print(iter_f.__next__())
print(iter_f.__next__())
print(iter_f.__next__())
print(iter_f.__next__())

 

iter_f.__next__() 等同於 next(iter_f)

 

4.實現列表取值的兩種方法

方法一:索引

f 
= [1, 2, 3, 4, 5] print(f[2])

 

方法二:利用迭代器思想

iter_f = f.__iter__()
print(iter_f.__next__())
print(iter_f.__next__())

 

5.遍歷列表內部全部值的兩種方法

方法一:利用 for 迴圈(基於迭代器協議)
f = [1, 2, 3, 4, 5]
for i in f:
  print(i)

 

方法二:利用 while 迴圈

f = [1, 2, 3 ,4, 5]
index = 0
while index < len(f):
    print(f[index])
    index += 1

 

思考:並非所有型別的資料遍歷都可以用while迴圈。序列型別字串、列表、元祖都有下標
使用while迴圈,利用下標遍歷,是可以的。但是對於非序列型別資料,如字典、集合、檔案物件
的遍歷,while 迴圈無法實現遍歷。但是利用 for 迴圈可以

因為for 迴圈就是基於迭代器協議提供了一個統一的可以遍歷所有物件的方法。即在遍歷前先呼叫物件的__iter__()方法,

將物件轉換為一個迭代器,然後使用迭代器協議就可以實現迴圈訪問。所以 for 迴圈較為強大。

舉例:

#字典的迴圈:
dic = {'key1':1, 'key2':2}
for i in dic:
    print(i)

#執行結果
key1
key2

#for 迴圈作用:    
dic = {'key1':1, 'key2':2}
iter_dic = dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())

#注意:對於字典,預設遍歷的是key值

 

#檔案的迴圈:
f = open('日誌檔案', 'r+')
for i in f:
print(i,end='')
#執行結果
1111
2222
3333
4444
#注意:for迴圈每次遍歷的是檔案的一行內容


#for 迴圈作用:    
f = open('日誌檔案', 'r+')
iter_f = f.__iter__()
print(iter_f.__next__(), end='')
print(iter_f.__next__(), end='')
print(iter_f.__next__(), end='')
print(iter_f.__next__(), end='')

 

寫在後面:

最近好像有點煩躁

心情也不是很好  階段性心情差

想打人!!!!

希望睡一覺起來會好一些吧