python生成器的惰性計算


 

最近學習了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在某時某刻的綁定關系,尤為重要

 

希望這篇博客能幫助你們!謝謝!輕點問候!

 


免責聲明!

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



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