Python 中的柯里化

2024 年 8 月 29 日 | 5 分钟阅读

在本教程中,我们将学习 Python 中的柯里化,这是一个 Python 中的新概念。大多数开发者对此主题并不熟悉。我们将解释柯里化的概念、其用例以及如何在 Python 中实现它。让我们来了解一下 Python 中的柯里化。

什么是柯里化?

在数学和计算机科学中,柯里化是将接受多个参数的函数分解为接受单个参数的函数的函数。在这里,让我们把它讲清楚。术语“curry”来自数学家 Haskell Curry 的名字,而不是一种辛辣的菜肴。

柯里化是将一个具有多个参数的函数转换为一系列单参数函数的转换。我们可以说,将函数 f(a, b, c, …..) 转换为类似 f(a)(b)(c)…… 的函数。

柯里化也用于理论计算机科学,因为它通常更容易将多参数模型转换为单参数模型。

函数组合

我们定义两个函数 f 和 g 的组合 h。

所以它将定义为我们在 Python 中定义装饰器的方式;内部函数的输出成为外部函数的输入。

我们将在接下来的示例中使用此函数。现在让我们理解另一个示例。

假设我们有一个温度计,它工作不准确。可以使用 temp_correction 函数计算正确温度。我们将温度值从摄氏度转换为华氏度。我们可以通过将组合应用于这两个函数来做到这一点。

示例 -

输出

44.5 50.0

两个函数的组合通常不是可交换的,即 compose (celsius2fahrenheit, readjust) 不同于 compose(readjust, celsius2fahrenheit)

输出

47.3 50.0

Convert2 并不是我们问题的解决方案,因为它并没有重新调整我们温度计的实际温度,而是重新调整了转换后的华氏度值。

柯里化的数学表示

f(x, y) = (x*x*x) + (y*y*y)

h(x) = (x*x*x)

h(y) = (y*y*y)

h(x)(y) = h(x)+h(y)

f(x, y) = h(x)(y)

Curry f = h(x)(y)

它将如下所示地链式组合函数。

示例 - 1:a(x) = b(c(d(x)))

示例 - 2:v(a, b, c, d, e) = w(x(y(z(a, b, c, d, e))))

输出

20 30 50 60

当函数链很长时,会很复杂。从而将一个大的操作块简化为类似的序列块。让我们理解下面的示例。

示例 -

输出

524934.3832020997

在下一个示例中,我们将转换时间并定义函数链。

示例 - 2

输出

1728000

具有任意数量参数的柯里化函数

这里就出现了问题,如何对具有任意且未知数量参数的函数进行柯里化?

我们可以使用嵌套函数来“柯里化”参数。我们需要一种方法来告诉函数计算并返回值。被调用的带有参数的函数将被柯里化。如果我们不带参数调用函数,它将告知 Python 函数我们最终想要结果。

让我们理解下面的例子。

示例 -

输出

5.571428571428571
4.333333333333333
4.333333333333333

让我们打印一些重要的参数,这将有助于我们更好地理解。

示例 -

输出

Calling curried function with:
args:  (2,) kwargs:  {}
Currying the values:
f_args:  [2]
f_kwargs: {}
Calling curried function with:
args:  (5,) kwargs:  {}
Currying the values:
f_args:  [2, 5]
f_kwargs: {}
Calling curried function with:
args:  (9,) kwargs:  {}
Currying the values:
f_args:  [2, 5, 9]
f_kwargs: {}
Calling curried function with:
args:  (4, 5) kwargs:  {}
Currying the values:
f_args:  [2, 5, 9, 4, 5]
f_kwargs: {}
Calling curried function with:
args:  (5, 9) kwargs:  {}
Currying the values:
f_args:  [2, 5, 9, 4, 5, 5, 9]
f_kwargs: {}
Calling mean_val with:
[2, 5, 9, 4, 5, 5, 9] {}
5.571428571428571

结论

柯里化在许多情况下都有帮助,但重要的是要注意其局限性。