python產生器的惰性計算

來源:互聯網
上載者:User

標籤:size   就是   部落格   產生   gen   range   理解   生產   技術分享   

 

最近學習了python的迭代器和產生器,產生器的是有一個特點的,就是用到資料時才會去取來用!請觀察下面代碼思考問題,想明白了,你就會明白什麼是惰性計算了!

 1 def add(s, x): 2     return s + x 3  4  5 def gen(): 6     for i in range(4): 7         yield i 8  9 10 base = gen()11 for n in [1, 10]: 12     base = (add(i, n) for i in base)  13 print(list(base)) 

輸出:[20, 21, 22, 23]            很不解吧,請往下看

 

 

 

 

 

 

這個題的關鍵點在於下面幾點:

1.因為迴圈在做的事是用產生器運算式產生資料,而產生器有個惰性計算特點,導致把我們引上一條不歸路,我們被假象迷惑,其實它並沒做任何事,而是單純的走了兩邊過程

2.產生器就是等到用的(比如:列印或者next函數取值等)得時候才會進行計算生產,所以等到最後列印的時候才開始計算

3.當開始生產資料的時候,迴圈已經進行的兩次n的值也因此變成了10

4.第一次迴圈產生器生產數用到的base還是綁定的gen取0,1,2,3經過加工(add函數加操作),產生器生產出10,11,12,13,然後base順利佔據了產生器

5.第二次迴圈在進行向base取值時,base已經不再是gen而是上次迴圈重新綁定的base,所以取到的值是10,11,12,13然後經過自己的加工生產出20,21,22,23,到這時大功告成。

6.千萬別把  for   n   in   [1,10]   想成了      for n in range (1,10)

7.可能n變成了10很意外,但是理解了惰性之後也就明白了為神魔n在為1時沒進行運算

8.一定要理清base在某時某刻的綁定關係,尤為重要

 

希望這篇部落格能協助你們!謝謝!輕點問候!

 

python產生器的惰性計算

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.