Nhảy đến nội dung chính

functools

functools là một module chuẩn trong Python, cung cấp các công cụ giúp thao tác và cải tiến hàm – như lưu cache kết quả, tạo decorator, hay cố định đối số cho hàm.

Nói đơn giản: functools giúp bạn viết code ngắn gọn hơn, tối ưu hơn và linh hoạt hơn khi xử lý hàm.

Một số hàm nổi bật trong functools

@lru_cache – Ghi nhớ kết quả hàm (caching)

from functools import lru_cache

@lru_cache(maxsize=100)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

print(fib(35))  # Rất nhanh nhờ cache

Tăng tốc đáng kể cho các hàm đệ quy hoặc tính toán nặng lặp lại nhiều lần.

partial() – Gán sẵn một số đối số cho hàm

from functools import partial

def power(base, exponent):
    return base ** exponent

square = partial(power, exponent=2)

print(square(4))  #  16

Tạo các hàm "rút gọn" rất tiện khi dùng với map, filter, GUI callback,...

wraps() – Bảo toàn metadata khi viết decorator

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Before function")
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def greet():
    """This is a greeting function"""
    print("Hello!")

print(greet.__name__)  # 👉 greet (không bị đổi thành 'wrapper')
print(greet.__doc__)   # 👉 This is a greeting function

Giữ lại tên hàm, docstring,... khi bạn tạo custom decorators.

reduce() – Áp dụng hàm tích lũy lên phần tử của list

from functools import reduce

nums = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, nums)
print(product)  # 👉 24

Dùng cho các phép cộng dồn, nhân dồn,... giống fold trong functional programming.

Khi nào nên dùng functools

Tình huống Dùng gì từ functools
Cần cache hàm đệ quy hoặc gọi lặp @lru_cache
Tạo decorator tùy chỉnh @wraps
Cần tạo hàm mới từ hàm cũ, rút gọn tham số partial()
Muốn tính toán tích lũy trên list reduce()

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft