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

时间:2015-10-04 17:06:28

标签: python python-3.x functional-programming

什么是定义函数partial_k(f, k, args)的好方法,它将任意函数f作为输入(fn位置参数),值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)

我只能找到一些非常冗长的方法。

2 个答案:

答案 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)

For Python 3.5+:

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