python(十四)函数柯里化

懵逼

写这一节我有些懵逼,对于偏函数柯里化(Currying)和反柯里化(Uncurrying),百度的结果都不一样,这里我还是按照搜狗百科的柯里化结果来写吧

偏函数 = 柯里化 固定某个参数的值
反柯里化 使用单参函数实现多参函数
原理 但这些的原理都是通过返回一个新的函数来实现的

偏函数 / 柯里化

有时候我们在复用已有函数时可能需要固定其中的部分参数,这除了可以
通过默认值参数来实现之外,还可以使用偏函数。例如,有个函数用来实现3个数字相加:

def add1(a, b, c):
    return a + b + c

如果现在需要一个类似的函数,与上面的函数add1()的区别仅在于参数 b 固定为一个数字(例如666),这时就可以使用偏函数的技术来复用上面的函数。

def add2(a, b):
    return add1(a, 666, b)

print(add2(12, 13))

或者使用标准库functools提供的partial()方法创建指定函数的偏函数。

from functools import partial

def add1(a, b, c):
    return a + b + c

add2 = partial(add1, b=666)
# 使用 partial 来实现偏函数时,要指定参数名
print(add2(a = 12, c = 13))

反柯里化

归功于Python对函数嵌套定义和lambda表达式的支持,可以使用单参数函数来实现多参数函数。

使用 lambda 表达式

def add(a):
    print("a = {}".format(a))  # a = 1
    return lambda b: a + b

# 有两种调用的方法
# 第一种
add1 = add(1)
print(add1(2))  # 3
# 第二种
print(add(1)(2))  # 3

使用函数嵌套定义

def add(a):
    def add2(b):
        return a + b
    return add2

print(add(1)(2))  # 3

总结

我感觉,无论是柯里化还是反柯里化,其原理都是通过返回一个函数来实现的,比如:

add1 = add(1)
print(add1(2))  # 3

这里的 add(1) 返回一个函数,所以 add1 就是一个函数,add1(2) 就是调用这个函数

你可能感兴趣的:(python)