定义一个函数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)
我只能找到一些非常冗长的方法。
您可以使用包装器函数并使用切片将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)
对于Python 3.5+:
def partial_k(f, k, seq):
def wrapper(x):
return f(*seq[:k], x, *seq[k:])
return wrapper
您可以使用functools包中的内容来进一步简化,但基本上:
def make_partial(f, args, k):
def func(x):
new_args = args[:k] + [x] + args[k:]
return f(*new_args)
return func