python 迭代器協議和生成器
一、什麼是迭代器協議
1.迭代器協議是指:物件必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個stoplteration異常,以終止迭代(只能往後走,不能往前退)
2.可迭代物件:實現了迭代器協議的物件(如何實現:物件內部定義一個__iter__()方法)
3.協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件
二、python中強大的for迴圈機制
for迴圈的本質:迴圈所有物件,全都是使用迭代器協議。
正文清源:
很多人會想,for迴圈的本質就是遵循迭代器協議去訪問物件,那麼for迴圈的物件肯定都是迭代器了啊。沒錯,那既然這樣,for迴圈可以遍歷(字串,列表,元祖,字典,集合,檔案物件),那這些型別的資料肯定是可迭代物件啊?但是,我tmd為什麼定義一個列表=[1, 2, 3, 4]沒有next方法,打臉麼?
(字串,列表,元祖,字典,集合,檔案物件)這些都不是可迭代物件,只不過在for迴圈式,呼叫了他們內部的__iter__方法,把他們變成了可迭代物件。
然後for迴圈呼叫可迭代物件的__next__方法取值,而且for迴圈會捕捉stoplteration異常,以終止迭代。
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 ls = ['a', 'b', 'c'] 4 # 一、下標訪問方式,預設從0開始計數 5 print(ls[0]) 6 print(ls[1]) 7 print(ls[2]) 8 # print(ls[3]) # 報錯,超出索引下標 9 # # 二、遵循迭代器協議訪問方式 10 diedai_ls = ls.__iter__() 11 print(diedai_ls.__next__()) 12 print(diedai_ls.__next__()) 13 print(diedai_ls.__next__()) 14 # 三for迴圈訪問方式 15 for item in ls: 16print(item) 17 # 使用while迴圈方式 18 diedai_ls = ls.__iter__() 19 while True: 20try: 21print(diedai_ls.__next__()) 22except StopIteration: 23print('迭代完啦!') 24break