冻结除一个位置参数外的所有参数



定义一个函数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

最新更新