Các hàm bậc cao trong Python cho phép bạn thao tác với các hàm để tăng tính linh hoạt và khả năng tái sử dụng của mã của bạn. Bạn có thể tạo ra các hàm bậc cao bằng cách sử dụng các phạm vi lồng nhau hoặc các đối tượng có thể gọi được.
Ngoài ra, mô-đun functools cung cấp các tiện ích để làm việc với các hàm bậc cao, giúp dễ dàng hơn trong việc tạo ra các bộ trang trí (decorators) và các cấu trúc thao tác hàm khác. Hướng dẫn này sẽ khám phá khái niệm về hàm bậc cao trong Python và trình bày cách tạo ra chúng.
Hàm bậc cao là một hàm mà hoặc là nhận một hoặc nhiều hàm làm đối số, hoặc trả về một hàm như là kết quả của nó. Dưới đây, bạn có thể quan sát một số thuộc tính của hàm bậc cao trong Python −
Để tạo hàm bậc cao trong Python, bạn có thể sử dụng phạm vi lồng nhau hoặc đối tượng có thể gọi. Dưới đây, chúng ta sẽ thảo luận về chúng một cách ngắn gọn.
Một cách để định nghĩa một hàm bậc cao trong Python là sử dụng các phạm vi lồng nhau. Điều này bao gồm việc định nghĩa một hàm bên trong một hàm khác và trả về hàm bên trong.
Hãy quan sát ví dụ sau để tạo một hàm bậc cao trong Python. Trong ví dụ này, hàm multiplier nhận một đối số, a, và trả về một hàm khác là multiply, hàm này tính giá trị a * b.
def multiplier(a): # Nested function with second number def multiply(b): # Multiplication of two numbers return a * b return multiply # Assigning nested multiply function to a variable multiply_second_number = multiplier(5) # Using variable as high order function Result = multiply_second_number(10) # Printing result print("Multiplication of Two numbers is: ", Result)
Output
Khi thực thi chương trình trên, bạn sẽ nhận được các kết quả sau −
Multiplication of Two numbers is: 50
Một cách khác để tạo ra các hàm bậc cao là sử dụng các đối tượng có thể gọi. Điều này bao gồm việc định nghĩa một lớp với phương thức __call__ .
Dưới đây là một cách tiếp cận khác để tạo ra các hàm bậc cao là sử dụng các đối tượng có thể gọi được.
class Multiplier: def __init__(self, factor): self.factor = factor def __call__(self, x): return self.factor * x # Create an instance of the Multiplier class multiply_second_number = Multiplier(2) # Call the Multiplier object to computes factor * x Result = multiply_second_number(100) # Printing result print("Multiplication of Two numbers is: ", Result)
Output
Khi thực thi chương trình trên, bạn sẽ nhận được các kết quả sau −
Multiplication of Two numbers is: 200
Mô-đun functools cung cấp các hàm bậc cao hoạt động trên hoặc trả về các hàm khác. Bất kỳ đối tượng có thể gọi nào cũng có thể được coi là một hàm cho mục đích của mô-đun này.
Trong ví dụ này, my_decorator là một hàm bậc cao mà sửa đổi hành vi của hàm invite bằng cách sử dụng hàm functools.wraps() .
import functools def my_decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): print("Calling", f.__name__) return f(*args, **kwargs) return wrapper @my_decorator def invite(name): print(f"Welcome to, {name}!") invite("Tutorialspoint")
Output
Khi thực thi chương trình trên, bạn sẽ nhận được các kết quả sau −
Calling invite Welcome to, Tutorialspoint!
Hàm partial() của mô-đun functools được sử dụng để tạo ra một đối tượng 'partial' có thể gọi. Đối tượng này tự nó hoạt động như một hàm. Hàm partial() nhận một hàm khác làm đối số và cố định một phần của các đối số của hàm, dẫn đến một đối tượng mới với chữ ký đơn giản hơn.
Example
Trong ví dụ dưới đây, một hàm do người dùng định nghĩa myfunction() được sử dụng làm đối số cho một hàm từng phần bằng cách thiết lập giá trị mặc định cho một trong các đối số của hàm gốc.
import functools def myfunction(a,b): return a*b partfunction = functools.partial(myfunction,b = 10) print(partfunction(10))
Output
Khi thực thi chương trình trên, bạn sẽ nhận được các kết quả sau −
100
Tương tự như cách tiếp cận ở trên, mô-đun functools cung cấp hàm reduce() , nhận hai đối số, một hàm và một iterable. Hàm này trả về một giá trị duy nhất. Đối số hàm được áp dụng tích lũy cho hai đối số trong danh sách từ trái sang phải. Kết quả của hàm trong lần gọi đầu tiên trở thành đối số thứ nhất và mục thứ ba trong danh sách trở thành đối số thứ hai. Điều này được lặp lại cho đến khi danh sách được xử lý hết.
Example
import functools def mult(x,y): return x*y # Define a number to calculate factorial n = 4 num = functools.reduce(mult, range(1, n+1)) print (f'Factorial of {n}: ',num)
Output
Khi thực thi chương trình trên, bạn sẽ nhận được các kết quả sau −
Factorial of 4: 24