2017-04-02 90 views
0

我做了以下內容:拉姆達在列表理解錯誤

ll = [-8, -4, 0, 4, 8] 
[lambda x: x**2 for x in ll] 

並獲得以下錯誤:

[<function __main__.<listcomp>.<lambda>>, 
<function __main__.<listcomp>.<lambda>>, 
<function __main__.<listcomp>.<lambda>>, 
<function __main__.<listcomp>.<lambda>>, 
<function __main__.<listcomp>.<lambda>>] 

可能是什麼問題呢?我知道所需的結果可以通過下面的代碼來實現,但我想了解爲什麼lambda不能在列表理解中工作?

[x**2 for x in ll] 
+2

這不是一個錯誤。你在列表中獲得5個lambda表達式。你期望什麼? –

回答

1

爲了得到數字的平方在列表中,您不需要lambda表達式。您應該這樣做:

>>> [x**2 for x in ll] 
[64, 16, 0, 16, 64] 

在您的使用中,這不是錯誤。您在列表中看到對lambda函數的引用(因爲您沒有調用該函數)。爲了使其工作,你可以這樣做:

>>> ll = [-8, -4, 0, 4, 8] 
>>> f = lambda x: x**2 
>>> [f(x) for x in ll] 
[64, 16, 0, 16, 64] 

這相當於:

>>> [(lambda x: x**2)(x) for x in ll] 
[64, 16, 0, 16, 64] 

注: LAMBDA是不是在這裏所有需要

3

拉姆達返回一個函數,它不評估的功能,你可能想:

ll = [-8, -4, 0, 4, 8] 
[x**2 for x in ll] 

ll = [-8, -4, 0, 4, 8] 
f = lambda x: x**2 
[f(x) for x in ll] 

,它等於:

ll = [-8, -4, 0, 4, 8] 
def f(x): 
    return x**2 
[f(x) for x in ll] 
+0

感謝Pawel和@Moinuddin的回覆。所以我現在理解的是,[x中的lambda x:x ** 2]將返回一個包含5個函數引用的列表。 我期待它會返回一個函數對象,該函數將應用於列表「ll」的元素。 –

0

你沒有說清楚你期望的內容廣告,但是我建議這樣的:

ll = [-8, -4, 0, 4, 8] 
f = lambda x: x**2 
print([f(x) for x in ll]) 
2

你忘了調用lambda。這裏有一種方法可以做到這一點:

ll = [-8, -4, 0, 4, 8] 
print([(lambda x: x**2)(x) for x in ll])