標籤:理解 [] 三元 plt 工具 總結 產生 實現 自動
一:什麼是迭代器協議
1.迭代器協議是指:對象必須提供一個next方法,執行該方法要麼返回迭代器中的下一項,要麼就引起一個stoplteration異常,以終止協議(只能往後走不能往前)
2.可迭代對象:實現了迭代器協議的對象(如何?:對象內部定義一個_iter_()方法)
3.協議是一種約定,可迭代對象實現了迭代器協議,python的內部工具(如for迴圈,sum,min函數等)使用迭代器協議訪問對象。
二:for迴圈機制
1.for迴圈機制的本質:迴圈所有對象,全部都是使用迭代器協議。
三:什麼是產生器
1.產生器,可以理解為一種資料類型,這種資料類型自動實現了迭代器協議(其他的資料類型需要調用自己內建的_iter_方法),所以產生器就是可迭代對象。
2.產生器分類:在python中有兩種表現形式(python有兩種不同的方式提供產生器)
【1】產生器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果,yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便於下次從它離開的地方繼續執行。
1 def test(): 2 yield 1 3 yield 2 4 yield 3 5 res=test() 6 print(res) 7 print(res.__next__()) 8 print(res.__next__()) 9 #結果:<generator object test at 0x0000023E254BD8E0>10 # 111 # 2
【2】產生器運算式:類似於列表推導,但是產生器返回按需產生結果的一個對象,而不是一次構建一個結果清單。
1 laomuji=(‘雞蛋%d‘ %i for i in range(10)) 2 print(laomuji) 3 print(laomuji.__next__()) 4 print(laomuji.__next__()) 5 print(laomuji.__next__()) 6 print(next(laomuji)) 7 print(next(laomuji)) 8 #結果:<generator object <genexpr> at 0x0000015F1262D8E0> 9 # 雞蛋010 # 雞蛋111 # 雞蛋212 # 雞蛋313 # 雞蛋4
3.列表解析:
1 egg_list=[] 2 for i in range(10): 3 egg_list.append(‘雞蛋%d‘ %i) 4 print(egg_list) 5 #結果:[‘雞蛋0‘, ‘雞蛋1‘, ‘雞蛋2‘, ‘雞蛋3‘, ‘雞蛋4‘, ‘雞蛋5‘, ‘雞蛋6‘, ‘雞蛋7‘, ‘雞蛋8‘, ‘雞蛋9‘] 6 7 列表解析: 8 l=[‘雞蛋%d‘ %i for i in range(10)] 9 print(l)10 #結果:[‘雞蛋0‘, ‘雞蛋1‘, ‘雞蛋2‘, ‘雞蛋3‘, ‘雞蛋4‘, ‘雞蛋5‘, ‘雞蛋6‘, ‘雞蛋7‘, ‘雞蛋8‘, ‘雞蛋9‘]11 #列表解析將即將產生的列表結果放前面,for迴圈放在後面12 13 三元運算式:(三個操作,for迴圈前面是一個,for迴圈是一個,if條件這是一個)14 l1=[‘雞蛋%d‘ %i for i in range(10) if i>5 ]15 print(l1)16 #結果:[‘雞蛋6‘, ‘雞蛋7‘, ‘雞蛋8‘, ‘雞蛋9‘]17 #沒有四元運算式
總結:
1.把列表解析的[]換成()得到的就是產生器運算式
2.列表解析與產生器運算式都是一種便利的變成方式,只不過產生器運算式更加節省記憶體
3.Python不但使用迭代器協議讓for迴圈更加通用。大部分內建函數也是使用迭代器協議訪問對象的。例如,sum函數是Python的內建函數,該函數使用迭代器協議訪問對象,而產生器實現了迭代器協議,所以,我們可以直接計算一系列值得和:
1 sum(x**2 for x in range(4))
而不用多此一舉的先構造一個列表:
1 sum([x**2 for x in range(4)])
python—迭代器,產生器與for迴圈機制