1. 什么是函数式编程
函数式编程是一种编程范式,它将计算机程序视为数学函数的执行,避免了状态和可变数据。函数式编程强调函数的定义、调用和组合,而不是对状态的改变。
Python 3.x 支持函数式编程,Python标准库中的 functools
模块提供了函数式编程支持的工具。
2. functools模块中的常用函数
2.1 partial函数 (偏函数)
partial
函数可以将一个函数转换为另一个带有默认参数的函数。使用它可以简化一些代码,在某些情况下可以提高代码的可读性和可维护性。
假如我们有一个函数 add
,它接收两个参数并返回它们的和:
def add(a, b):
return a + b
现在我们想创建一个偏函数,它的第一个参数应该是 3
, 另一个变量在调用时才给出,要求这个变量在调用偏函数时必须命名。
from functools import partial
add_3 = partial(add, 3)
result = add_3(b=4)
print(result) # 输出 7
重点:利用partial
函数,我们可以减少代码重复。如果有一些函数需要在程序的不同位置的参数中使用相同的默认值,那么可以使用 partial
函数来申明函数并将部分参数设置为默认值。
2.2 reduce函数
reduce
函数对一个列表中的元素按顺序执行指定的二元操作,最终得到一个单一的值。其实是递归地将序列中相邻的元素两两相对。它的用法和map
、filter
等函数类似。
from functools import reduce
add = lambda x, y: x + y
lst = [1, 2, 3, 4, 5]
sum_ = reduce(add, lst)
print(sum_) # 输出 15
重点:事实上,当我们要做这种需要对一个可迭代对象进行逐项操作累加,累减,那么reduce
函数可以非常方便直观的实现。但是,需要注意reduce
使用时需要导入functools
模块。
2.3 partialmethod函数为单个实例绑定方法
functools.partialmethod
是类中的一个方法。它的不同之处在于第一个参数通常是实例本身,因此它不需要一个 self 参数,也可以用于绑定方法。
这个方法的参数类似于 partial
。但是由于它是绑定到实例上的,所以第一个参数为实例本身,这意味着它接受实例的 self 属性作为参数。
from functools import partialmethod
class Calculator:
def add(self, num1, num2):
return num1 + num2
add_3 = partialmethod(add, num2=3)
c = Calculator()
result = c.add_3(num1=4)
print(result) # 输出 7
重点:使用偏函数,可以为一个类的实例绑定方法。这种方法可以避免在多个实例中写出重复代码,同时保持代码的可读性和可维护性。
2.4 wraps函数
functools.wraps
是一个装饰器,用于将被包装的函数的属性复制到包装器函数中。
当我们创建一个装饰器时,我们希望包装器的名字和文档字符串与原函数相同。这可以用functools.wraps
实现。
这个函数接收一个函数作为参数,返回一个包装后的函数。
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''这是一个装饰器示例'''
return func(*args, **kwargs)
return wrapper
@my_decorator
def my_function():
'''这是一个例子函数'''
pass
print(my_function.__name__) # 输出 my_function
print(my_function.__doc__) # 输出 这是一个例子函数
重点:在编写装饰函数时,最好使用 functools.wraps
,因为它可以保留原始函数的元数据(函数名,参数列表,文档字符串等)。
3. 总结
在 Python 3.x 中,我们可以使用 functools
模块来支持函数式编程。在本文中,我们介绍了四个 functools
模块中常用的函数,包括 partial
,reduce
,partialmethod
和 wraps
。这些函数有助于减少代码的复杂性和冗余性,提高代码的可读性和可维护性。
总之,函数式编程有助于提高代码的可维护性和可重用性,可以使我们的程序更清晰,更易于阅读和维护。