Higher-order functions là các hàm có thể nhận hoặc trả về một hàm khác. Trong Python, các hàm được coi như là first-class objects, có nghĩa là chúng có thể được truyền như là tham số hoặc được trả về như là kết quả từ một hàm khác. Điều này cho phép ta tạo ra các hàm mạnh mẽ hơn và linh hoạt hơn.
Cú pháp khai báo:
def function1():
# do something
return
def function2(func):
# do something
func()
# do something
return
Trong đó, function1
là một hàm thông thường và function2
là một higher-order function vì nó nhận một hàm khác (func
) làm tham số.
Ví dụ 1:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def apply_operation(a, b, operation):
return operation(a, b)
print(apply_operation(5, 3, add)) # 8
print(apply_operation(5, 3, subtract)) # 2
Trong ví dụ này, add
và subtract
đều là các hàm nhận hai tham số và trả về kết quả của phép toán. apply_operation
là một higher-order function nhận hai số và một hàm làm tham số và trả về kết quả của việc áp dụng phép toán được chỉ định trên hai số đó.
Giải thích chi tiết:
Hàm apply_operation
có thể áp dụng bất kỳ hàm nào làm tham số của nó, ví dụ như hàm add
và subtract
. Điều này giúp chúng ta viết mã ngắn gọn hơn và tái sử dụng được nhiều lần. Hơn nữa, ta cũng có thể tạo ra các hàm higher-order khác để sử dụng với các loại hàm khác nhau. Ví dụ, ta có thể tạo ra một higher-order function khác nhận một danh sách các giá trị và một hàm để xử lý danh sách này. Các higher-order functions giúp chúng ta viết mã linh hoạt và dễ bảo trì hơn.
Ví dụ 2:
Sử dụng higher order function để tính giá trị trung bình của các phần tử trong một danh sách. Trong ví dụ này, chúng ta sẽ sử dụng higher order function để tính giá trị trung bình của các phần tử trong một danh sách. Đầu tiên, chúng ta sẽ viết một hàm average
để tính trung bình của một danh sách các số. Sau đó, chúng ta sẽ sử dụng higher order function reduce
để tính tổng của các phần tử trong danh sách và chia cho độ dài của danh sách để tính giá trị trung bình.
from functools import reduce
def average(numbers):
return reduce(lambda x, y: x + y, numbers) / len(numbers)
my_list = [1, 2, 3, 4, 5]
print(average(my_list)) # Output: 3.0
Ở đây, chúng ta sử dụng hàm reduce
từ module functools
để tính tổng của các phần tử trong danh sách numbers
. Hàm reduce
nhận vào hai tham số: một hàm và một iterable. Hàm được áp dụng lần lượt cho các phần tử trong iterable, với kết quả của phép tính trước đó được truyền vào như là tham số đầu tiên của phép tính tiếp theo. Ở đây, chúng ta sử dụng hàm lambda như là tham số đầu tiên của reduce
, với phép tính là cộng (x + y
), và iterable là danh sách numbers
.
Sau khi tính được tổng của các phần tử trong danh sách numbers
, chúng ta sẽ chia cho độ dài của danh sách để tính giá trị trung bình của các phần tử.
Ví dụ 3:
Sử dụng higher order functions để tính toán giá trị trung bình của một mảng. Trong ví dụ này, chúng ta sẽ sử dụng higher order functions để tính toán giá trị trung bình của một mảng. Đầu tiên, chúng ta sẽ tạo một hàm average
nhận một mảng và một hàm selector
làm tham số.
Hàm selector
sẽ được sử dụng để lựa chọn giá trị nào trong mỗi phần tử của mảng sẽ được tính toán giá trị trung bình. Sau đó, hàm average
sẽ sử dụng hàm selector
để tính toán giá trị trung bình của các giá trị đã lựa chọn.
def average(arr, selector):
selected = [selector(x) for x in arr]
return sum(selected) / len(selected)
Sau đó, chúng ta có thể sử dụng hàm average
để tính toán giá trị trung bình của mảng bằng cách truyền vào mảng và một hàm selector để lựa chọn giá trị nào trong mỗi phần tử của mảng:
arr = [1, 2, 3, 4, 5]
avg = average(arr, lambda x: x)
print(avg) # Output: 3.0
avg_squared = average(arr, lambda x: x**2)
print(avg_squared) # Output: 11.0
Ở đây, chúng ta đã sử dụng lambda functions để tạo ra các hàm selector khác nhau. Đầu tiên, chúng ta tính toán giá trị trung bình của các giá trị trong mảng bằng cách sử dụng giá trị ban đầu của mỗi phần tử. Sau đó, chúng ta tính toán giá trị trung bình của các giá trị trong mảng bằng cách sử dụng bình phương của mỗi phần tử.