📜  Python中的柯里化函数(1)

📅  最后修改于: 2023-12-03 15:04:36.686000             🧑  作者: Mango

Python中的柯里化函数

柯里化(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 表达式实现柯里化

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

这里通过柯里化实现了一个计时器,该计时器接收一个函数作为参数,并返回一个新的函数,在新的函数中添加了计时的功能。该计时器可以应用于大型计算的场景,以便发现程序中的性能瓶颈。

结语

柯里化是一种重要的函数式编程技巧,它可以帮我们更好地抽象和封装代码,让代码更加灵活和可复用。在需要高性能和高效率的场景下,柯里化可以帮我们更好地理解和优化代码。