python lambda結合列表推導式

時間 2021-06-02 14:52:55

1樓:jjjjjjj

Lazy Evaluation

引用維基百科:延遲求值特別用於函式式程式語言中。在使用延遲求值的時候,表示式不在它被繫結到變數之後就立即求值,而是在該值被取用的時候求值,也就是說,語句如x:

=expression;(把乙個表示式的結果賦值給乙個變數)明顯的呼叫這個表示式被計算並把結果放置到x中,但是先不管實際在x中的是什麼,直到通過後面的表示式中到x的引用而有了對它的值的需求的時候,而後面表示式自身的求值也可以被延遲,最終為了生成讓外界看到的某個符號而計算這個快速增長的依賴樹。

你給的示例最簡單的解釋:

列表生成式生成了包含10個Lambda表示式的列表,因為Lambda表示式會Lazy Evaluation,只有在取用的時候求值,可是此時i已經在列表生成式運算的時候增長到9,所以求值的時候都是2*9了。

2樓:

funcs這個列表裡的函式在生成的時候並沒有馬上計算出i的值,而是在呼叫這個函式的時候才給i賦值。

然而在funcs這個列表生成完的時候i就已經是9了,更別說呼叫函式的時候了。

至於為什麼,這就是……規則!

建議搜尋一下閉包了解相關知識

3樓:李巨集杰

func1 = [lambda x:x*i for i in range(10)]

[f1(2) for f1 in func1]

[18, 18, 18, 18, 18, 18, 18, 18, 18, 18]

func2 = [lambda x, i=i: x*i for i in range(10)]

[f2(2) for f2 in func2]

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

總結來說:

列表解析會生成一系列的函式物件, 類似於

def func():

pass

這個會產生乙個名為func的函式物件, 注意區別func(), 這個是呼叫函式物件.

函式物件只有在呼叫的時候才開始對內部的變數進行引用, 對i來說, 當函式對它引用的時候, 它已經變為9, 所以10個函式都引用了i=9.

那麼如何讓函式具有記憶功能呢?讓他可以記住每一次對應的i.

其實就是給函式設定預設引數, 在生成函式物件的時候把i賦值給它, 類似於:

def func(i=1):

pass

當你給函式預設值時, 這個預設值就變為了local, 根據LEGB原則, 在local中存在的變數, 我們就不需要到enclosing中尋找了.

放大招了

寫回答的時候突然有了靈感, 我們可以用下面的方法:

In [1]: func1 = (lambda x:x*i for i in range(10))

In [2]: [f1(2) for f1 in func1]

Out[2]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

注意看: 我們把列表解析式變為了生成器解析式, 結果又和我們預期的一樣了, 這是怎麼回事?

對於生成器, 只有你需要的時候它才會求值, 這也是和列表解析式的區別, 列表解析式只要你執行, 馬上就把i變為了9, 可是生成器不會, 當你呼叫第乙個函式的時候, 他把相應的i求出來, 然後停止, 等你下一次呼叫, 這個就完美符合我們的預期了.

在Python學習手冊中關於這個現象有專門的一小節:

4樓:

global frame裡面最後的i等於9,list的每個lamba function中的i是一樣的。因此都是2×9為18

5樓:Coldwings

乙個列表,列表裡的每乙個元素是個lambda function,就是如此。

至於那個i,因為是個變數,在lambda求值時它是9,也就是說構造lambda的時候i是幾並不重要,lambda裡只是用了這麼個引用;求值時i是多少它就是多少。

如何列公式

李大俠 IF COUNTIF F2 F3,A2 A11 C2 C11 CHOOSE B2 B11,0,0.02,0.04,0.02,0.02 徐徐不倦 公式的後半段是 IF B3 3 C3 0.02,C3 0.04 這個公式的含義是當B3的內容是文字格式3時,返回C3 0.02,否則返回C3 0.0...

2 列縮排相比 4 列縮排有什麼壞處?

靳凱 用python的時候不得不喜歡兩格 用c 喜歡四格,左括號不能單獨一行,嗯!至於八格,sorry,一直很窮買不起寬屏 董君 這麼說吧,這就好比 source insight相比vim有什麼壞處?dos相比linux有什麼壞處?xml相比json有什麼壞處?一句話,是乙個程式設計師不成熟的表現!...

excel公式求助,比較abc三列,若a列最小d列等於3,若b列最小d列等於1,若c列最小d列等於0

jaffedream 用查詢公式就行了。方法一 LOOKUP 1,0 A2 C2 MIN A2 C2 方法二 INDEX MATCH MIN A2 C2 A2 C2,0 1 僅保留負數參與判斷,且三個負數不相等,但沒有排除兩個負數相等的情況 陣列公式,需要按ctrl shift enter才能出現花...