📜  python functools - Python (1)

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

Python functools - 能够帮助你构建更加健壮的Python程序

functools模块包含了一些高阶函数(higher-order functions)和工具函数,这些函数提供了一些额外功能的装饰器,以及用于将函数串起来的功能。在本篇文章中,我们将介绍此模块的几个功能。

1. 偏函数(Partial function)

偏函数是一个可以将函数的参数绑定到固定值的函数。在Python中,我们可以使用functools.partial()函数创建偏函数。

import functools

def greeting(prefix, name):
    return f"{prefix}, {name}!"

# 创建偏函数 greet_hello
greet_hello = functools.partial(greeting, prefix="Hello")

# 调用 greet_hello
print(greet_hello("Mike"))  # Hello, Mike!
2. 装饰器(Decorator)

Python中的装饰器是使用函数包装另一个函数,以添加额外的功能。使用functools.wraps装饰器,它会复制函数的名称和文档字符串,并可选地复制函数的模块和函数签名。

import functools

def debug(function):
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        print(f"Function name: {function.__name__}")
        print(f"Function args: {args}")
        print(f"Function kwargs: {kwargs}")
        return function(*args, **kwargs)
    return wrapper

@debug
def calc(a, b):
    return a + b

calc(1, 2) 
# Output:
# Function name: calc
# Function args: (1, 2)
# Function kwargs: {}
# 3
3. 缓存(Caching)

Python中的functools.lru_cache()可以用于缓存先前计算的函数结果并提高函数的性能。缓存的结果可以在后续的函数调用中被重复使用,而不需要重新计算。

import functools

@functools.lru_cache(maxsize=128)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 55
4. 包装器(Wrapper)

functools.wraps装饰器不仅可以用于装饰器,还可以用于函数的包装器。包装器可用于向现有函数添加功能。

import functools

def wrapper(func):
    @functools.wraps(func)
    def wrapped():
        print("Before the function is called.")
        func()
        print("After the function is called.")
    return wrapped

@wrapper
def say_hello():
    print("Hello world!")

say_hello()
# Output:
# Before the function is called.
# Hello world!
# After the function is called.

以上是 functools 模块的一些高级使用技巧,这些功能能够帮助你构建更加健壮的Python程序,适用于从初学到高级开发者。