1. 程式人生 > >python生成器的惰性計算

python生成器的惰性計算

代碼 加工 一次循環 自己的 分享圖片 gen 一次 有一個 bsp

最近學習了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生成器的惰性計算