1. 程式人生 > >【筆記】Python基礎四

【筆記】Python基礎四

一,迭代器協議和for迴圈工作機制

(一),迭代器協議

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

2,可迭代物件:實現了迭代器協議的物件(如何實現,物件內嵌一個__iter__()方法)

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

 

(二),for迴圈工作機制

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

正本清源:(字串,列表,元組,字典,集合,檔案物件)這些都不是可迭代物件,只不過在for迴圈時,呼叫了他們內部的__iter__方法,把他們變成了可迭代物件。然後for迴圈呼叫可迭代物件的__next__方法去取值,而且for迴圈會捕捉Stopiteration異常,終止迭代。

例1,__next__()模擬for迴圈

l = [1,2,3]
for i in l:  #for迴圈遵循迭代器協議,先呼叫l.__iter__()將其轉換成一個迭代器,然後使用__next方法得到每一個值
    print(i)

#for迴圈模擬
x = 'hello'
iter_test = x.__iter__()

print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__
()) '''輸出: h e l l o '''

例2,取列表的兩種方法

l = [1,2,3]
#第一種:索引
print(l[0])
#輸出:l

#索引遍歷
index = 0
while index < len(l):
    print(l[index])
    index += 1
'''輸出:
1
2
3
'''

#第二種:__next__()方法
iter_l = l.__iter__()
print(iter_l.__next__())
#輸出:l

(三)for迴圈存在的作用

序列型別:字串,列表,元組都有下標,可以使用索引訪問,但是非序列型別:字典,集合,檔案就不行。

for迴圈基於迭代器協議提供了一個統一的可以遍歷所有物件的方法。

#集合只能使用for迴圈
s = {'a','b','c'} 
for i in s:
    print(i)
'''輸出:
a
c
b
'''

#for迴圈字典名時,取到的值是字典的key
dic = {'aa':1,'bb':2}
iter_d= dic.__iter__()
print(iter_d.__next__())
#輸出:bb

#使用for迴圈檔案控制代碼f的好處是:迭代器只在用的時候返回一個值,而不像readlines把所有內容都加在到記憶體裡
f = open('text.txt','r+')
iter_f = f.__iter__()
print(iter_f.__next__(),end='')
print(iter_f.__next__(),end='')
#輸出:1111
#輸出:2

#使用while語句模擬for迴圈
l=[1,2,3,4,5]
diedai_l=l.__iter__()
while True:
    try:
        print(diedai_l.__next__())
    except StopIteration:
        print('迭代完畢了,迴圈終止了')
        break
'''輸出:
1
2
3
4
5
迭代完畢了,迴圈終止了
'''

#內建方法next函式,就是在呼叫iter_l.__next__()
l = ['die','erzi','sunzi','chongsunzi']
iter_l = l.__iter__()
print(next(iter_l))
#輸出:die

#迭代器就是可迭代物件,遵循迭代器協議就是可迭代物件
#怎樣把一個數據結構變成可迭代物件,就是呼叫__iter__()方法
#如果資料結構沒有__iter__()方法,就不是可迭代物件