黃哥Python:Python 惰性求值(英語:Lazy Evaluation)

在編程語言理論中,惰性求值(英語:Lazy Evaluation),又譯為惰性計算、懶惰求值,也稱為傳需求調用(call-by-need),是一個計算機編程中的一個概念,它的目的是要最小化計算機要做的工作。它有兩個相關而又有區別的含意,可以表示為“延遲求值”和“最小化求值”,除可以得到性能的提升外,惰性計算的最重要的好處是它可以構造一個無限的數據類型。

惰性求值的相反是及早求值,這是一個大多數編程語言所擁有的普通計算方式。

延遲求值特別用於函數式編程語言中。在使用延遲求值的時候,表達式不在它被綁定到變量之後就立即求值,而是在該值被取用的時候求值,也就是說,語句如x:=expression; (把一個表達式的結果賦值給一個變量)明顯的調用這個表達式被計算並把結果放置到x中,但是先不管實際在x中的是什麼,直到通過後面的表達式中到x的引用而有了對它的值的需求的時候,而後面表達式自身的求值也可以被延遲,最終為了生成讓外界看到的某個符號而計算這個快速增長的依賴樹。

有網友問:

<code>li = [lambda :x for x in range(10)]

res = li[0]()

print(res)

#輸出:9/<code>


想問一下問什麼輸出是9啊?


黃哥Python回答: 由於編程語言延遲求值的特性,在使用延遲求值的時候,表達式不在它被綁定到變量之後就立即求值,而是在該值被取用的時候求值,

當調用li[0]() 函數時,x的值已經是9了,所以輸出的是9


如何修改為正常的輸出0 1 2 3 4 5 6 7 8 9 呢?

定義函數時,添加默認參數即可。


<code>li2 = [lambda x=x:x for x in range(10)]

res = li2[0]()

print(res)
for i in li2:
print(i(), end=" ")/<code>


黃哥Python:Python 惰性求值(英語:Lazy Evaluation)


分享到:


相關文章: