Saturday, November 23, 2024

[Python] Lesson 50 – Higher order functions

-

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, addsubtract đề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 addsubtract. Đ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ử.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories