Python 中的函子及其用法


函数式编程利用函子的概念来帮助程序员创建更模块化、可重用和合理的代码。它们是一种将值或函数封装在对象中,然后在不改变原始对象的情况下操作该对象的方法。函子是编写 Python 中模块化、可重用代码的强大工具,可以使用类来实现。

语法

由于 Python 函子是使用类(语言的关键组件)实现的,因此无需特殊安装。只需构建一个类,其中包含一个接受原始值或函数作为参数的 init 方法,以及一个接受转换函数作为参数的 call 方法,即可在 Python 中创建函子类。然后,原始值或函数将受到转换函数的影响,并返回结果。

算法

  • 定义一个类,在 init 方法中将原始值或函数作为参数。

  • 定义一个 call 方法,该方法将转换函数作为参数。

  • 将转换函数应用于原始值或函数。

  • 返回转换的结果。

示例

class NumberFunctor:
   def __init__(self, value):
      self.value = value
        
   def __call__(self, f):
      return f(self.value)
    
def square(x):
   return x * x

functor = NumberFunctor(5)
result = functor(square)
print(result)

输出

25

定义一个名为 NumberFunctor 的类,它在 **init** 方法中以一个值作为参数。然后,我们定义一个 **call** 方法,该方法以一个函数作为参数。在这种情况下,该函数是 square。我们在 **call** 方法中将 square 应用于该值,并返回结果。最后,我们使用值为 5 的 NumberFunctor 创建一个实例,并使用 square 作为转换函数调用该函子。结果是 25,即 5 的平方。

示例

class StringFunctor:
   def __init__(self, value):
      self.value = value
        
   def __call__(self, f):
      return f(self.value)
    
def uppercase(s):
   return s.upper()

functor = StringFunctor("hello")
result = functor(uppercase)
print(result)

输出

HELLO

创建一个名为“StringFunctor”的类,该类在 __init__ 方法中以字符串作为参数,并且必须首先定义一个接受函数作为参数的 call 方法。在此示例中提供的函数是 uppercase。在 **call 方法**内部,字符串将受到 uppercase 函数的影响,并且返回结果字符串,之后可以使用字符串“hello”生成 **StringFunctor** 的实例。用于调用函子的 **转换** 函数是 uppercase。结果将是原始字符串“hello”的大写形式,即 **“HELLO”。**

示例

class Functor:
   def __init__(self, value):
      self.value = value
        
   def __call__(self, f):
      return Functor(f(self.value))
    
   def __repr__(self):
      return f"Functor({self.value})"
    
def add(x):
   def inner(y):
      return x + y
   return inner

functor = Functor(5)
result = functor(add(3))(add(3))

print(result)

输出

Functor(11)

“Functor”类的 **“__call__”** 方法以函数作为参数,并接受值作为输入。**“add”** 方法将其参数添加到起始值并返回一个闭包,该闭包允许实例化一个将输入作为函子并返回一个新的函子来增加输入值的转换函数。最后一步是构建一个值为 5 的 **“Functor”** 实例,并使用 **“add”** 对其执行两次转换,将值增加三 (3) 并将第一次转换的结果增加三 (3)。最终结果是一个值为 **11** 的新函子。

应用

  • 函子是编程范式和应用程序中使用的多功能工具。

  • 在面向对象编程中,它们可以封装行为以供重用并定义标准接口。

  • 在 **OOP** 中实现诸如 **策略** 和 **访问者模式** 等设计模式。

  • 在 **函数式编程** 中,用于映射、过滤、折叠和函数组合。

  • 在 **数据管道** 中,它们为数据转换定义标准接口并将转换操作组合成管道。

  • 应用 **转换** 来提取、过滤、转换或聚合数据管道中的数据。

  • 通过定义 **预处理、特征工程** 和 **模型训练步骤** 的管道来构建复杂的机器学习模型。

结论

函子是构建模块化、可重用和可组合代码的强大工具,使开发人员能够进行更具数据驱动性、面向对象和实用性的编程。在构建可以以可组合方式链接的转换时,它们非常理想,并且通常在 Python 中使用类来实现。借助函子,程序员可以编写更具表现力、可扩展性和易于维护的代码。

更新于: 2023-08-22

648 次查看

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告