学过Haskell等函数式编程语言的人,应该对于柯里化不陌生,简单地说,柯里化就是把多元函数化成一元函数。比如,下面的 add 函数是二元函数。
def add(a, b):
return a + b
我们可以换一种写法:
def add(a):
def g(b):
return a + b
return g
# 输出7
print(add(3)(4))
这样就把所有的函数调用都化成了只有一个参数。
我们可以用装饰器快速实现柯里化:
import functools
def _currying2(func):
@functools.wraps(func)
def wrapper(a):
return lambda b: func(a, b)
return wrapper
def currying(n):
if n == 2:
return _currying2
else:
def decorator(func):
@functools.wraps(func)
def wrapper(a):
return currying(n-1)(lambda *args: func(a, *args))
return wrapper
return decorator
@currying(3)
def add(a, b, c):
return a + b + c
# 输出10
print(add(3)(6)(1))