🌱 [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:
- 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() và 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í | Lambda | def |
---|---|---|
Định nghĩa | Biểu thức đơn | Có thể nhiều dòng |
Tên hàm | Vô danh / gán tên khi cần | Luôn có tên |
Return | Tự trả về biểu thức | Dùng return |
Docstring / chú thích | Không hỗ trợ | Có thể có docstring, chú thích |
Độ phức tạp | Giới hạn logic nhỏ gọn | Phù 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 😊