🌱 [Python] 12 - Python Lambda Function - Hàm vô danh, ví dụ & best practices

🌱 [Python] 12 - Python Lambda Function - Hàm vô danh, ví dụ & best practices

   Nếu bạn đã từng làm việc với ngôn ngữ lập trình C, bạn sẽ quen với toán tử ba ngôi ?: dùng để thay thế cho câu lệnh if-else, hay các function-like macro để viết các hàm một cách ngắn gọn! Đối với Python, một số trường hợp dev cũng cần viết nhanh các hàm chỉ trên một dòng, để code ngắn gọn, dễ hiểu hơn!

   Lambda function (hàm vô danh) là công cụ tiện dụng để viết các hàm nhỏ gọn trong Python. Bên cạnh cú pháp cơ bản, nó có nhiều use case thú vị khi kết hợp với filter, map, reduce hoặc làm tham số cho hàm khác.

1 - Lambda Function và cú pháp

   Lambda là hàm vô danh (anonymous function), được viết bằng từ khóa lambda, không cần tên hàm và thường dùng cho các biểu thức nhỏ gọn.

   ↪ Cú pháp:

python lambda function

  • lambda: keyword để định nghĩa hàm lambda.
  • arguments: tham số (có thể nhiều hoặc không).
  • expression: biểu thức đơn (không dùng return).

   ↪ Ví dụ đơn giản:

is_even = lambda x: x % 2 == 0
print(is_even(4))  # True
print(is_even(7))  # False

   Lưu ý rằng lambda có thể làm code khó đọc nếu sử dụng quá phức tạp.

2 - Use cases & ví dụ

Điều kiện trong lambda

    Cách sử dụng giống như câu lệnh ?: trong ngôn ngữ C, sử dụng câu lệnh điều kiện trong hàm lambda, thường dùng để kiểm tra điều kiện, trả về min, max, ...

sign = lambda x: "Positive" if x > 0 else ("Zero" if x == 0 else "Negative")
print(sign(10)) # Positive
print(sign(0)) # Zero
print(sign(-5)) # Negative

Tạo list các lambda bằng comprehension

    ↪ Về List Comprehension: 🌱 [Python] 7 - List trong Python

    Hiểu đơn giản thì list comprehension giúp ta tạo ra một list các giá trị đặc biệt theo một công thức nào đó, và các giá trị đặc biệt đó được tạo ra từ hàm hàm lambda.

    Ví dụ sử dụng lambda kết hợp với list comprehension để chuyển đổi list các chuỗi sang upper!

cities = ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"]

# Using lambda in list comprehension
upper_cities = [(lambda x: x.upper())(city) for city in cities]

print(upper_cities)

    Kết quả:

['NEW YORK', 'LOS ANGELES', 'CHICAGO', 'HOUSTON', 'PHOENIX']

Trả về nhiều giá trị

    Lambda cũng hỗ trợ trả về nhiều giá trị, hoặc một list/tuple một cách ngắn gọn thay vì sử dụng return như hàm thông thường.

pair = lambda x, y: (x + y, x * y)
print(pair(3, 5)) # (8, 15)

    lambda cũng thường được dùng trong các hàm cao hơn như decorator, callback hoặc nơi cần truyền hàm ngắn gọn.

3 - Lambda Function với các hàm filter(), map(), reduce()

    Ba hàm filter(), map()reduce() là những công cụ quan trọng trong Functional Programming của Python. Chúng cho phép xử lý và biến đổi dữ liệu theo phong cách hàm, giúp mã ngắn gọn, dễ đọc và tránh dùng quá nhiều vòng lặp for.


🔹 1. filter()  Lọc dữ liệu theo điều kiện

    Hàm filter(function, iterable) sẽ duyệt qua từng phần tử trong iterable và chỉ giữ lại những phần tử khiến function trả về True. Kết quả trả về là một đối tượng filter, thường được ép kiểu sang list() hoặc tuple() để xem kết quả.

nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4, 6]

💡 Giải thích: Hàm lambda x: x % 2 == 0 kiểm tra xem một số có chia hết cho 2 không. Những số nào thỏa điều kiện này sẽ được giữ lại — kết quả là danh sách các số chẵn [2, 4, 6].

📌 Use case phổ biến:

  • Lọc dữ liệu từ cảm biến, loại bỏ giá trị lỗi hoặc ngoại lệ.
  • Lọc danh sách sinh viên có điểm trung bình > 8.
  • Lọc danh sách file theo đuôi mở rộng cụ thể (ví dụ chỉ giữ “.txt”).


🔹 2. map()  Biến đổi phần tử trong danh sách

    Hàm map(function, iterable) sẽ áp dụng một hàm lên từng phần tử trong iterable và trả về một đối tượng map chứa các giá trị đã được biến đổi. Cách dùng này giúp thay thế vòng lặp for khi bạn muốn áp dụng cùng một phép biến đổi cho tất cả phần tử.

a = [1, 2, 3, 4]
doubles = list(map(lambda x: x * 2, a))
print(doubles) # [2, 4, 6, 8]

💡 Giải thích: Hàm lambda x: x * 2 nhân đôi mỗi phần tử trong danh sách a. map() trả về danh sách mới [2, 4, 6, 8] mà không làm thay đổi danh sách gốc.

📌 Use case phổ biến:

  • Tăng giá trị cảm biến lên hệ số hiệu chỉnh cố định.
  • Chuẩn hóa dữ liệu (ví dụ: chuyển từ độ C sang độ F).
  • Áp dụng cùng một phép toán cho toàn bộ dữ liệu đầu vào.


🔹 3. reduce() → Gộp dữ liệu thành một giá trị duy nhất

    Hàm reduce(function, iterable) (thuộc module functools) dùng để tích lũy hoặc tổng hợp dữ liệu. Nó lần lượt áp dụng hàm function(x, y) lên từng phần tử của iterable để thu được một giá trị cuối cùng.

from functools import reduce

nums = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, nums)
print(product) # 24

💡 Giải thích: reduce() hoạt động như sau:

  • Bước 1: 1 × 2 = 2
  • Bước 2: 2 × 3 = 6
  • Bước 3: 6 × 4 = 24 Kết quả cuối cùng là 24

📌 Use case phổ biến:

  • Tính tổng, tích hoặc trung bình các phần tử trong danh sách.
  • Tổng hợp dữ liệu cảm biến (ví dụ: tổng năng lượng tiêu thụ).
  • Chuỗi hóa dữ liệu (gộp các chuỗi con lại thành một chuỗi hoàn chỉnh).


🔹 So sánh nhanh

Hàm Chức năng chính Trả về Ví dụ nhanh
filter() Lọc phần tử theo điều kiện Danh sách con filter(lambda x: x>0, nums)
map() Biến đổi từng phần tử Danh sách mới map(lambda x: x*2, nums)
reduce() Gộp toàn bộ dữ liệu thành 1 giá trị Giá trị đơn reduce(lambda x,y: x+y, nums)

    ➽ Ba hàm này đặc biệt mạnh khi kết hợp cùng lambda function hoặc List Comprehension, giúp bạn viết code ngắn, gọn, dễ hiểu và mang phong cách lập trình hàm hiện đại.

4 - Ví dụ mở rộng

    Lambda function trong Python có thể được sử dụng linh hoạt trong nhiều ngữ cảnh khác nhau, đặc biệt là khi bạn cần truyền hàm dưới dạng tham số hoặc muốn viết code ngắn gọn, dễ đọc. Dưới đây là một số ví dụ nâng cao giúp bạn hiểu rõ hơn cách ứng dụng Lambda trong thực tế.

Lambda làm tham số cho hàm khác

    Lambda có thể được truyền như một đối số cho hàm khác. Đây là cách phổ biến để viết các hàm xử lý dữ liệu hoặc callback ngắn gọn mà không cần định nghĩa hàm bằng def.

def apply(func, value):
return func(value)

print(apply(lambda x: x**2, 5)) # 25

    Ở ví dụ trên, hàm apply() nhận vào một hàm func và một giá trị value. Khi truyền vào lambda x: x**2, hàm sẽ tính bình phương giá trị đầu vào. Đây là cách đơn giản để áp dụng logic linh hoạt mà không cần định nghĩa hàm riêng.

Sắp xếp với key phức tạp

    lambda thường được dùng làm key trong hàm sorted() để xác định quy tắc sắp xếp phức tạp. Ví dụ dưới đây minh họa cách sắp xếp danh sách các điểm theo trục Y (giá trị thứ hai trong tuple):

points = [(2, 3), (1, 5), (3, 1)]
sorted_by_y = sorted(points, key=lambda p: p[1])
print(sorted_by_y) # [(3, 1), (2, 3), (1, 5)]

    Ở đây, lambda p: p[1] giúp chọn phần tử thứ hai của từng tuple để làm tiêu chí sắp xếp. Cách này thường dùng khi xử lý danh sách các đối tượng, tuple, hoặc dictionary phức tạp.

Partial / Closure sử dụng Lambda

    Lambda cũng có thể được dùng để tạo hàm “một phần” (partial function) hoặc closure, tức là hàm có thể ghi nhớ giá trị trong phạm vi bao quanh nó. Đây là ví dụ điển hình:

def make_multiplier(n):
return lambda x: x * n

times3 = make_multiplier(3)
print(times3(7)) # 21

    Ở đây, make_multiplier() trả về một hàm lambda có khả năng “nhớ” giá trị của n. Khi gọi times3(7), lambda thực chất là lambda x: x * 3. Đây là một ví dụ đơn giản về closure trong Python.

Lambda trong hàm cao hơn hoặc callback

    Lambda thường được dùng trong các hàm “cao hơn” (higher-order function) như sorted(), map(), hoặc trong callback (ví dụ GUI, threading). Dưới đây là ví dụ minh họa việc dùng lambda để sắp xếp tên không phân biệt hoa thường:

names = ["alice", "Bob", "CHARLIE"]
sorted_names = sorted(names, key=lambda s: s.lower())
print(sorted_names) # ['alice', 'Bob', 'CHARLIE']

    Ở đây, lambda s: s.lower() giúp chuẩn hóa tất cả chuỗi về dạng chữ thường trước khi sắp xếp, đảm bảo thứ tự đúng bất kể viết hoa hay viết thường. Cách viết này ngắn gọn và rất hiệu quả trong xử lý chuỗi.

5 - So sánh Lambda vs def & Best practices

So sánh nhanh giữa Lambda và def

Tiêu chíLambdadef
Định nghĩaBiểu thức đơnCó thể nhiều dòng
Tên hàmVô danh / gán tên khi cầnLuôn có tên
ReturnTự trả về biểu thứcDùng return
Docstring / chú thíchKhông hỗ trợCó thể có docstring, chú thích
Độ phức tạpGiới hạn logic nhỏ gọnPhù hợp logic phức tạp

Best practices & hạn chế

  • Hạn chế viết lambda quá dài hoặc phức tạp, dễ gây khó hiểu. (nên dùng hàm định nghĩa nếu logic vượt quá vài biểu thức nhỏ)
  • Ưu tiên dùng hàm built-in nếu có sẵn (ví dụ sum(), sorted() với key, …) thay vì write lambda + reduce / map.
  • Ưu tiên def khi cần debug, đặt breakpoint, thêm docstring, hoặc cấu trúc nhiều dòng.
  • Lambda tốt khi dùng trong hàm callback, key function, closures, hoặc để truyền nhanh một hàm nhỏ gọn.
  • Tránh lồng lambda phức tạp hoặc làm chuỗi dài, có thể gây khó đọc và khó bảo trì.

>>>>>> Follow ngay <<<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn
//