[英]Combine list of lambdas in a single one
在單個函數中組合 lambda 列表的 Pythonic 方法是什么? 例如:
lambdas = [lambda x, k=k: x+k for k in range(3)]
我想在與此類似的單個 lambda 中得到這一切,但不必輸入它:
f = lambda x: lambdas[2](lambdas[1](lambdas[0](x)))
您可以使用functools.reduce
執行此操作,如下所示:
from functools import reduce
lambdas = [lambda x, k=k: x+k for k in range(3)]
# x = 0
reduce(lambda x, l: l(x), lambdas, x)
# -> l[2](l[1](l[0](x)))
# step_1 : x = x , l = lambda[0] -> lambda[0](x)
# step_2 : x = lambda[0](x), l = lambda[1] -> lambda[1](lambda[0](x))
# step_3 : x = lambda[1](lambda[0](x)), l = lambda[2] -> lambda[2](lambda[1](lambda[0](x)))
reduce
函數被定義為正是您想要的。 另一種方法是使用簡單的 for 循環。
def f(x):
for func in lambdas:
x = func(x)
return x
用 lambda 來做這件事似乎有點奇怪。
是否有任何具體原因導致我們不能:
def function_chainer(lambdas):
def chained(x):
for function in lambdas:
x = function(x)
return chained
這個解決方案不是單行的,但我相信它是 pythonic 的。
如果你真的需要單線,你可以使用 functools.reduce:
lambda x: functools.reduce(lambda a, f: f(a), lambdas, x)
reduce 的第一個參數控制應用每個后續元素的方式,第二個是可迭代的(這里 - 我們的 lambda 可迭代),最后一個是初始化器 - 我們要傳遞給那些 lambda 函數的第一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.