📅  最后修改于: 2023-12-03 15:04:36.686000             🧑  作者: Mango
柯里化(Currying)是一种函数式编程技术,它通过让函数返回另一个函数来实现多参数函数的单参数化,这种技术的名字来自于其发明者之一 Haskell Curry。
在 Python 中,柯里化可以通过闭包和 lambda 表达式实现,让函数变得更加灵活和可复用。
def add(x):
def inner(y):
return x + y
return inner
add5 = add(5)
print(add5(3)) # 8
上述代码将一个接收两个参数的函数 add,拆分成了两个接收单个参数的函数 add 和 inner。通过调用 add 函数生成一个新的 inner 函数,并返回该函数,从而实现了柯里化。
lambda 表达式可以将柯里化写得更加简洁:
add = lambda x: lambda y: x + y
add5 = add(5)
print(add5(3)) # 8
上述例子都是单参数的柯里化,如果需要实现多个参数的柯里化,可以使用 functools.partial
方法。
例如,下面代码将一个接收 3 个参数的函数拆分成了 3 个接收单个参数的函数:
import functools
def add(x, y, z):
return x + y + z
add1 = functools.partial(add, 1)
add1and2 = functools.partial(add1, 2)
print(add1and2(3)) # 6
这里的 functools.partial
方法接收一个函数和一个参数列表,返回一个新的函数,该函数将原函数的前 n 个参数固定住,返回一个新的函数,该函数只需要接收剩余的参数即可完成调用。
柯里化可以应用于很多场景,例如:缓存、延迟计算、调试、统计等。下面是一个例子:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} run time:", end_time - start_time)
return result
return wrapper
@timer
def add(x, y):
time.sleep(1)
return x + y
print(add(3, 5))
运行结果:
add run time: 1.0029881000518799
8
这里通过柯里化实现了一个计时器,该计时器接收一个函数作为参数,并返回一个新的函数,在新的函数中添加了计时的功能。该计时器可以应用于大型计算的场景,以便发现程序中的性能瓶颈。
柯里化是一种重要的函数式编程技巧,它可以帮我们更好地抽象和封装代码,让代码更加灵活和可复用。在需要高性能和高效率的场景下,柯里化可以帮我们更好地理解和优化代码。