簡體   English   中英

如何使用 lambda 函數在循環中定義非常量函數列表?

[英]How to define a list of non-constant functions in a loop with lambda functions?

假設我想創建一個函數列表funclist ,這樣該列表的函數就會以這種方式運行:

funclist[0](x) = 0
funclist[1](x) = x
funclist[2](x) = 2*x
funclist[3](x) = 3*x

假設列表太長(例如大小為 100)而無法逐個定義這些函數,那么自然的編寫方法是:

funclist = []
for k in range(100):
    f = lambda x: k*x
    funclist.append(f)

問題是這種方法不起作用,因為 Python 解釋 function 定義中的局部變量的方式。 這是我在這個網站上經常看到的一個問題,例如這里這里 不幸的是,這些用戶想要定義常量函數,因此建議的解決方案(即定義可迭代變量 k 的本地副本)對我不起作用(這也是Python 常見問題解答中提出的相同解決方案)。 例如,以下語法不起作用:

funclist = []
for k in range(100):
    f = lambda local_k=k, x: local_k*x
    funclist.append(f)

我找到的解決方案是:

funclist = []
for k in range(10):
    def f(x, product_factor=k): return x*product_factor
    funclist.append(f)

可以按我的意願工作。 我也可以使用partial function 實現相同的結果:

from functools import partial 

def product(x,product_factor): return x*product_factor
funclist = []
for k in range(10):
    funclist.append( partial(product, product_factor=k) )

所以我的問題是:有什么方法可以僅使用 lambda 函數來實現此結果? 或者我有一個“移動參數”這一事實注定我要以某種方式或其他方式定義兩個變量的 function? 讓我准確地說我問這個是因為我想更好地理解函數和柯里化在 Python 中是如何工作的。

您的 lambda 方法不起作用,因為您在位置參數之前有一個關鍵字參數。 只需像在工作解決方案中那樣翻轉順序:

funclist = [(lambda x, local_k=k: local_k*x) for k in range(100)]

>>> funclist[3](8)
24
>>> funclist[5](9)
45

最初的問題是 k 只被評估了一次,在循環結束時,而這里 function 創建,對 get_function 的調用,每次都會觸發對 k 的評估。

當然,您使用默認參數的解決方案也可以,這顯然是解決此問題的最常見解決方案

現在您說它不適用於 lamdba,這僅僅是因為您將默認參數放在首位:

funclist = []
for k in range(100):
    f = lambda  x, local_k=k,: local_k*x
    funclist.append(f)


print(funclist[10](3)) #30
print(funclist[99](3)) # 297
print(funclist[0](3)) # 0

工作得很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM