请详细介绍一下 python 中的 functools,支持哪些功能,有哪些典型应用场景
functools
是 Python 标准库中的一个模块,提供了高阶函数和可调用对象的工具。它包含了一些用于函数式编程的实用函数,能够简化代码、提高可读性和性能。以下是 functools
模块的一些主要功能和典型应用场景:
functools.partial
:
partial
来简化代码。from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
print(square(3)) # 输出 9
functools.reduce
:
sum
函数,但更通用。from functools import reduce
numbers = [1, 2, 3, 4]
result = reduce(lambda x, y: x * y, numbers)
print(result) # 输出 24
functools.lru_cache
:
from functools import lru_cache
@lru_cache(maxsize=32)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 输出 55
functools.wraps
:
wraps
可以保留被装饰函数的元数据。from functools import wraps
def my_decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
print("Something is happening before the function is called.")
result = f(*args, **kwargs)
print("Something is happening after the function is called.")
return result
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
functools.total_ordering
:
<
, <=
, >
, >=
),但只想手动实现其中的一个或两个时。from functools import total_ordering
@total_ordering
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
def __lt__(self, other):
return self.age < other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
print(p1 > p2) # 输出 True
functools.cmp_to_key
: 将一个旧式的比较函数转换为一个关键字函数,以便与 sorted
等函数一起使用。functools.singledispatch
: 实现单分派泛型函数,允许根据第一个参数的类型调用不同的函数实现。functools
模块提供了一系列强大的工具,能够简化函数式编程中的许多常见任务。通过使用这些工具,你可以编写出更简洁、更高效的代码。无论是部分应用、缓存、装饰器还是比较方法,functools
都能为你提供便利。