python—迭代器,產生器與for迴圈機制

來源:互聯網
上載者:User

標籤:理解   []   三元   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迴圈機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.