Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Thư viện functools trong Python
Thư viện functools
trong Python là một công cụ mạnh mẽ chứa các hàm bậc cao giúp lập trình viên xử lý và thao tác với các hàm một cách linh hoạt hơn. Thư viện này cung cấp nhiều tính năng tiện ích như lưu trữ bộ nhớ đệm (caching), thực hiện các phép toán tích lũy, và tạo các hàm một phần (partial functions).
Các hàm bậc cao trong Python
Hàm là một đoạn mã thực hiện xử lý dựa trên các tham số đầu vào và trả về kết quả sau khi xử lý. Khi một hàm nhận một hàm khác làm tham số hoặc trả về một hàm làm kết quả, nó được gọi là hàm bậc cao. Một số hàm bậc cao phổ biến như map()
, reduce()
, và filter()
.
Ví dụ về một hàm bậc cao tùy chỉnh:
def create_function(aggregation: str): if aggregation == "sum": return sum elif aggregation == "mean": def mean(arr: list): return sum(arr) / len(arr) return mean return None
Thư viện functools
trong Python
Các hàm chính trong thư viện functools
bao gồm:
Bài viết này được đăng tại [free tuts .net]
reduce
: Hàm này nhận một hàm và một iterable làm tham số. Nó thực hiện tính toán tích lũy trên các phần tử trong iterable, trả về giá trị cuối cùng.
from functools import reduce print(reduce(lambda x, y: x + y, [1, 2, 3])) # Kết quả: 6
partial
: Hàm partial
giúp tạo ra một hàm mới với một số tham số đã được cố định giá trị.
from functools import partial def target_func(arg_one, arg_two): print(f"arg_one = {arg_one}, arg_two = {arg_two}") partial_one = partial(target_func, arg_two="World!") partial_one(arg_one="Hello") # Kết quả: arg_one = Hello, arg_two = World!
@cache
: Decorator cache
lưu trữ các kết quả của hàm dựa trên tham số đầu vào nhằm tăng tốc độ xử lý cho các lần gọi lại sau này. cache
có sẵn từ Python 3.9 và không giới hạn dung lượng lưu trữ bộ nhớ đệm.
from functools import cache @cache def fibonacci(n): if n in [0, 1]: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(11)) # Kết quả: 89
@lru_cache
: Một lựa chọn tối ưu hơn @cache
vì @lru_cache
cho phép giới hạn dung lượng bộ nhớ đệm và chỉ lưu trữ một số lượng nhất định các kết quả gọi hàm gần nhất.
from functools import lru_cache @lru_cache(maxsize=2) def fibonacci(n): if n in [0, 1]: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(11)) # Kết quả: 89
@wraps
: Khi sử dụng decorator, hàm gốc thường bị mất thông tin, chẳng hạn như tên hàm và tài liệu (docstring). @wraps
giúp giữ nguyên các thông tin của hàm gốc sau khi áp dụng decorator.
from time import time from functools import wraps def timeit(func): @wraps(func) def inner_timeit(*args, **kwargs): start = time() func(*args, **kwargs) print(f"Function ran in {time() - start} seconds") return inner_timeit @timeit def print_range(n: int): """Print numbers from 1 to n""" for i in range(1, n+1): print(i) print(print_range.__name__) # Kết quả: print_range print(print_range.__doc__) # Kết quả: Print numbers from 1 to n
Kết bài
Thư viện functools
cung cấp các công cụ mạnh mẽ cho việc xử lý các hàm và tối ưu hóa hiệu suất trong Python. Việc hiểu rõ và sử dụng thư viện này sẽ giúp bạn dễ dàng làm việc với các hàm phức tạp và tận dụng tối đa các tính năng của ngôn ngữ.