python—迭代器,生成器與for循環機制


一:什么是迭代器協議

      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 #     1
11 #     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 #      雞蛋0
10 #      雞蛋1
11 #      雞蛋2
12 #      雞蛋3
13 #      雞蛋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)])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM