写这一节我有些懵逼,对于偏函数、柯里化(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表达式的支持,可以使用单参数函数来实现多参数函数。
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) 就是调用这个函数