[英]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.