0

Hàm Lambda trong Python: Sử dụng hiệu quả với map, filter, Reduce

Bài viết này sẽ hướng dẫn bạn cách sử dụng hàm lambda trong Python, bao gồm cú pháp, trường hợp sử dụng và những hạn chế. Từ đó, bạn có thể viết mã Python ngắn gọn, hiệu quả và dễ quản lý hơn.

Hàm Lambda trong Python là gì?

Trong Python, hàm lambda là một hàm nhỏ, ẩn danh được định nghĩa bằng từ khóa lambda. Các hàm này thường được sử dụng cho các thao tác ngắn gọn, dùng một lần, khi mà việc định nghĩa một hàm đầy đủ có thể là quá mức cần thiết.

Chúng được gọi là ẩn danh vì chúng không yêu cầu tên (mặc dù chúng có thể được gán cho một biến để sử dụng lại). Hàm lambda vượt trội trong các trường hợp bạn cần một hàm đơn giản, nhanh chóng trong một khoảng thời gian ngắn, và việc định nghĩa một hàm đầy đủ sẽ là quá mức. Điều này làm cho chúng trở nên lý tưởng cho các hoạt động đơn giản và có thể được viết trên một dòng, chẳng hạn như tính toán toán học đơn giản hoặc chuyển đổi dữ liệu cơ bản.

Chúng đặc biệt được sử dụng trong ngữ cảnh lập trình hàm với các hàm bậc cao hơn như map, filter và reduce trong đó chúng thường được truyền dưới dạng đối số. Chỉ cần nhớ rằng đối với các hoạt động phức tạp hơn, các hàm thông thường được ưu tiên hơn vì khả năng đọc và khả năng bảo trì của chúng.

Cú pháp và cách sử dụng cơ bản của hàm Lambda

lambda arguments: expression

# to give it a name, assign it to a variable:
function_name = lambda arguments: expression

# this is equivalent to:
def function_name(arguments):
    return expression

Không giống như các hàm thông thường được định nghĩa bằng def, hàm lambda bị giới hạn trong một biểu thức duy nhất do thiết kế của chúng hướng đến sự đơn giản và ngắn gọn. Chúng có thể nhận một hoặc nhiều đối số nhưng không thể chứa câu lệnh hoặc nhiều biểu thức. Hàm Lambda được thiết kế cho các hoạt động ngắn gọn, đơn giản có thể được viết trên một dòng.

Ví dụ:

# Regular function to find the average of three numbers
def average(x, y, z):
    return (x + y + z) / 3

# Lambda function to find the average of three numbers
average = lambda x, y, z: (x + y + z) / 3

Mặc dù hàm lambda chỉ có thể chứa một biểu thức, nhưng chúng ta vẫn có thể làm được rất nhiều việc với chúng. Ví dụ: đây là Hàm Lambda để nối 2 chuỗi và chuyển đổi chúng thành chữ hoa:

concat_and_uppercase = lambda str1, str2: (f'The concatenated string is {str1 + str2}'.upper())

print(concat_and_uppercase("hello", "world"))  # Output: THE CONCATENATED STRING IS HELLOWORLD

Cách gọi hàm Lambda

Có ba cách chính để sử dụng hoặc gọi hàm lambda:

1. Gán cho một biến

Gán hàm lambda cho một biến và sau đó gọi nó bằng cách sử dụng biến đó:

multiply = lambda x, y: print(f'{x} * {y} = {x * y}')
multiply(2, 10)  # Output: 2 * 10 = 20

or 

multiply = lambda x, y: f'{x} * {y} = {x * y}'
print(multiply(2, 10))  # Output: 2 * 10 = 20

2. Gọi trực tiếp hàm Lambda

Định nghĩa và gọi ngay hàm lambda bằng cách đặt định nghĩa trong ngoặc đơn và cung cấp trực tiếp các đối số:

print((lambda x, y: f'{x} * {y} = {x * y}')(2, 10))  # Output: 2 * 10 = 20

or

(lambda x, y: print(f'{x} * {y} = {x * y}'))(2, 10)  # Output: 2 * 10 = 20

3. Sử dụng làm đối số cho các hàm bậc cao hơn

Hàm Lambda thường được sử dụng làm đối số cho các hàm bậc cao hơn như map, filter và reduce. Đây là những hàm nhận các hàm khác làm đối số.

Chúng giúp xử lý các tập hợp dữ liệu (như danh sách hoặc bộ dữ liệu) theo kiểu lập trình hàm.

Sử dụng hàm lambda với map()

Hàm map áp dụng một hàm được chỉ định cho mỗi mục trong một iterable (như danh sách) và trả về một iterable mới với các mục được cập nhật.

# syntax

map(function, iterable)

Trong đó:

  • function ở đây nhận một đối số và trả về một giá trị.
  • Các phần tử của iterable (ví dụ: list, tuple) sẽ được truyền cho hàm.

Ví dụ:

# List of pairs of numbers
pairs = [(2, 3), (4, 5), (6, 7)]

# Using lambda function with map to multiply each pair and print the result
list(map(lambda pair: print(f'{pair[0]} * {pair[1]} = {pair[0] * pair[1]}'), pairs))

Giải thích: Trong mã này, chúng ta sử dụng hàm lambda để định nghĩa một hàm nhỏ, ẩn danh nhận mỗi cặp số và in phép nhân của chúng. Hàm map áp dụng hàm lambda này cho mỗi cặp (tuple) trong danh sách.

Việc bao bọc lệnh gọi map bằng list đảm bảo rằng hàm lambda được thực thi cho mỗi cặp. Do đó, mã sẽ in kết quả phép nhân cho mỗi cặp trong danh sách, hiển thị kết quả như "2 3 = 6", "4 5 = 20" và "6 * 7 = 42".

Sử dụng hàm lambda với filter()

Hàm filter lọc các phần tử trong một iterable dựa trên một vị ngữ được chỉ định. Chỉ các phần tử mà vị ngữ trả về True mới được đưa vào iterable mới.

# syntax

filter(predicate, iterable)

Vị ngữ là một hàm nhận một đối số và trả về một giá trị boolean (True hoặc False). Các phần tử lặp lại ở đây sẽ được kiểm tra bởi vị ngữ.

Ví dụ:

# List of ages
ages = [25, 30, 18, 42, 17, 50, 22, 19]

# Function to filter adults (age 18 and above) using filter with lambda
adults = filter(lambda age: age >= 18, ages)
print(list(adults))  # Output: [25, 30, 18, 42, 50, 22, 19]

Giải thích: Trong mã này, chúng ta bắt đầu bằng một danh sách tuổi. Chúng ta sử dụng hàm lambda để định nghĩa một điều kiện đơn giản kiểm tra xem một độ tuổi có từ 18 tuổi trở lên hay không. Hàm filter áp dụng hàm lambda này cho từng độ tuổi trong danh sách, lọc ra bất kỳ độ tuổi nào dưới 18.

Bằng cách chuyển đổi kết quả của filter thành danh sách, chúng ta thu được danh sách các độ tuổi từ 18 trở lên. Cuối cùng, chúng ta in danh sách đã lọc này, kết quả là các độ tuổi [25, 30, 18, 42, 50, 22, 19] được hiển thị, vì đây là những độ tuổi đáp ứng tiêu chí từ 18 tuổi trở lên.

Sử dụng hàm lambda với reduce()

Hàm reduce áp dụng một hàm được chỉ định cho các phần tử của một iterable theo cách tích lũy để giảm chúng thành một giá trị duy nhất. Nó là một phần của mô-đun functools.

# syntax

from functools import reduce
reduce(function, iterable)

Ở đây, Hàm lấy hai đối số và trả về một giá trị duy nhất. Các phần tử lặp lại sẽ được hàm xử lý.

Ví dụ:

from functools import reduce

# List of numbers
numbers = [1, 2, 3, 4, 5]

# Using reduce with lambda to sum the numbers
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)  # Output: 15

Giải thích: Trong đoạn mã này, chúng ta bắt đầu với một danh sách các số. Chúng ta sử dụng hàm reduce từ mô-đun functools để tính tổng của tất cả các số trong danh sách. Chúng ta sử dụng hàm lambda để định nghĩa một phép toán cộng đơn giản lấy hai đối số x và y, và trả về tổng của chúng. Hàm reduce này áp dụng hàm lambda theo cách tích lũy cho các mục trong danh sách, bắt đầu từ cặp đầu tiên và tiếp tục trong toàn bộ danh sách, như sau:

  • Ban đầu, x là phần tử đầu tiên của danh sách (1) và y là phần tử thứ hai (2), kết quả là 3.
  • Tổng này (3) sau đó trở thành x, và phần tử tiếp theo trong danh sách (3) trở thành y, tạo ra 6.
  • Quá trình này tiếp tục cho đến khi tất cả các phần tử trong danh sách được cộng lại. Cuối cùng, kết quả cuối cùng là 15, biểu thị tổng của tất cả các số trong danh sách [1, 2, 3, 4, 5].

Các trường hợp sử dụng bổ sung

Các hàm Lambda cũng có thể được sử dụng trong sắp xếp hoặc các ngữ cảnh lập trình chức năng khác. Ví dụ:

1. Sắp xếp danh sách các chuỗi

cities = ["India", "Germany", "America", "Japan"]
sorted_cities = sorted(cities, key=lambda city: city.lower())

print(sorted_cities)  # Output: ['America', 'Germany', 'India', 'Japan']

Trong mã này, chúng ta có một danh sách được gọi là cities chứa tên của các thành phố khác nhau. Chúng ta sử dụng hàm sorted để sắp xếp các tên thành phố này theo thứ tự bảng chữ cái, bỏ qua phân biệt chữ hoa chữ thường. Tham số key trong hàm sorted cho phép chúng ta chỉ định một hàm (trong trường hợp này là hàm lambda) để tùy chỉnh thứ tự sắp xếp.

Hàm lambda lambda city: city.lower() chuyển đổi từng tên thành phố thành chữ thường trước khi sắp xếp. Điều này đảm bảo rằng việc sắp xếp không phân biệt chữ hoa chữ thường, do đó các thành phố có chữ viết hoa khác nhau sẽ được xử lý theo cùng một cách.

Sau khi sắp xếp, danh sách đã sắp xếp được gán cho biến sorted_cities, và chúng ta in kết quả. Đầu ra hiển thị danh sách các thành phố đã sắp xếp: ['America', 'Germany', 'India', 'Japan'], trong đó các thành phố được sắp xếp theo thứ tự bảng chữ cái, bỏ qua trường hợp của các chữ cái.

2. Các hàm Lambda trong List Comprehension

Các hàm Lambda có thể được sử dụng trong các biểu thức danh sách để áp dụng một hàm cho mỗi phần tử trong danh sách.

Ví dụ:

# List of numbers
numbers = [1, 2, 3, 4, 5]

# Using lambda in list comprehension to square each number
squared_numbers = [(lambda x: x ** 2)(x) for x in numbers]
print(squared_numbers)  # Output: [1, 4, 9, 16, 25]

Kết luận

Hàm Lambda trong Python cung cấp một cách nhanh chóng và ngắn gọn để tạo các hàm nhỏ, dùng một lần. Chúng đặc biệt hữu ích trong lập trình hàm với các hàm bậc cao như map, filter, và reduce.

Trong khi các hàm lambda mạnh mẽ và súc tích, hãy đảm bảo bạn cân bằng việc sử dụng chúng với khả năng đọc và bảo trì mã. Đối với logic phức tạp hơn, các hàm thông thường được định nghĩa bằng def được ưu tiên vì chúng hỗ trợ nhiều biểu thức và câu lệnh và bạn có thể bao gồm tài liệu hướng dẫn.

Bằng cách hiểu và sử dụng các hàm lambda một cách hiệu quả, bạn có thể viết mã Python ngắn gọn và hiệu quả hơn. Cảm ơn các bạn đã theo dõi.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí