2017-08-28 38 views
1

我想創建一個lambdas列表,但它並沒有像我希望的那樣工作。Python中的列表理解和lambdas

L = [(lambda x: x/y) for y in range(10)] 

我希望每一個功能列表中按索引來劃分它的參數,但所有的功能只有最後一個索引劃分。

>>> L[1](5) 
0.5555555555555556 
>>> L[5](5) 
0.5555555555555556 
>>> 5/9 
0.5555555555555556 

是這樣的列表解析,其中每一個拉姆達都有自己的y副本可能在Python的?

+0

只有一個'y'在你的代碼,並在建立名單後,'y'擁有值9 – khelwood

回答

2

在拉姆達的y指的是最後一個值y曾在其來自的範圍內,即9

得到你想要的行爲,最簡單的方法是在你的拉姆達使用默認參數:

lambda x, y=y: x/y 

這在lambda函數被定義的時刻捕獲的y值。

你也可以做一個「雙拉姆達」,在調用一個函數,返回你想要的拉姆達,傳遞的y所需的值:

(lambda y: lambda x: x/y)(y) 

這裏,外殼拉姆達提供了新的每次你給它打電話時,範圍。

1

你需要循環和lambda在不同的範圍。

def make_divider(y): 
    return lambda x: x/y 

L = [make_divider(y) for y in range(10)] 

print(L[2](5) == 5/2) 
print(L[4](5) == 5/4) 
+0

這就是說明什麼是必須做的非常簡潔和優雅的方式。 – kindall