python生成器的惰性計算
阿新 • • 發佈:2018-07-21
代碼 加工 一次循環 自己的 分享圖片 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生成器的惰性計算