標籤: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產生器的惰性計算