什么是定义函数partial_k(f, k, args)
的好方法,它将任意函数f
作为输入(f
取n
位置参数),值k ,以及n-1
值列表,并返回一个新函数,冻结f
除第k个参数以外的所有参数?
例如:
def f(a, b, c):
return (a, b, c)
assert partial_k(f, 2, [0, 1])(10) == (0, 1, 10) # lambda x: (0, 1, x)
assert partial_k(f, 1, [0, 1])(10) == (0, 10, 1) # lambda x: (0, x, 1)
我只能找到一些非常冗长的方法。
答案 0 :(得分:3)
您可以使用包装函数并使用切片将k
项之前和之后的参数传递给原始函数f
:
def partial_k(f, k, seq):
seq = tuple(seq) # To handle any iterable
def wrapper(x):
return f(*(seq[:k] + (x,) + seq[k:]))
return wrapper
print(partial_k(f, 2, [0, 1])(10))
print(partial_k(f, 1, [0, 1])(10))
<强>输出:强>
(0, 1, 10)
(0, 10, 1)
def partial_k(f, k, seq):
def wrapper(x):
return f(*seq[:k], x, *seq[k:])
return wrapper
答案 1 :(得分:1)
你可以使用functools包中的东西来进一步简化,但基本上是:
def make_partial(f, args, k):
def func(x):
new_args = args[:k] + [x] + args[k:]
return f(*new_args)
return func