Python mang đến nhiều công cụ giúp code trở nên mạnh mẽ và tinh gọn hơn, trong đó có hàm ẩn danh, hay còn gọi là Lambda Function. Nắm vững khái niệm hàm ẩn danh là gì sẽ mở ra nhiều cách viết code thú vị và hiệu quả. Bài viết này từ InterData sẽ cùng bạn tìm hiểu sâu về hàm lambda là gì, cú pháp, ưu nhược điểm, cách phân biệt với hàm def và cách ứng dụng hiệu quả trong thực tế lập trình Python. Đọc ngay!
Hàm ẩn danh là gì?
Hàm ẩn danh trong Python (Anonymous Function), thường được biết đến với tên gọi Hàm Lambda, là một dạng hàm đặc biệt không có tên định danh rõ ràng như hàm thông thường. Chúng được tạo ra bằng cách sử dụng từ khóa lambda và được thiết kế để thực hiện các chức năng đơn giản, gọn lẹ.
Mục đích chính của việc sử dụng hàm lambda là để viết code ngắn gọn và súc tích hơn, đặc biệt là khi bạn cần một hàm nhỏ cho một tác vụ cụ thể và không có ý định tái sử dụng nó ở nhiều nơi khác.

Cú pháp hàm Lambda của Python
Cú pháp: lambda arguments : expression
- Lambda: Từ khóa để xác định hàm.
- arguments_list: Danh sách các tham số đầu vào được phân tách bằng dấu phẩy (giống như trong một hàm thông thường).
- expression: Một biểu thức duy nhất được đánh giá và trả về.
Ví dụ chi tiết về hàm ẩn danh
Ví dụ 1: Ví dụ khai báo một lambda function để tính tổng của 2 biến.
add = lambda a, b: a + b # call lambda add(3, 4) # 7
Kiểm tra xem lambda có kiểu dữ liệu là gì.
add = lambda a, b: a + b type(add) # function
Ví dụ 2:
greet = lambda : print('Hello World')
Ở đây định nghĩa một hàm lambda và gán nó cho biến có tên greet.
Để thực hiện hàm lambda này, chúng ta cần gọi nó. Sau đây là cách chúng ta có thể gọi hàm lambda
# call the lambda greet()
Hàm lambda ở trên chỉ đơn giản in ra văn bản ‘Hello World’.
Lưu ý: Hàm lambda này không có đối số nào.
Lợi ích và hạn chế của hàm ẩn danh Lambda
Việc sử dụng hàm lambda trong Python mang lại cả những lợi ích đáng kể về sự gọn nhẹ và tiện lợi, đồng thời cũng có những hạn chế riêng mà bạn cần nắm rõ để áp dụng đúng cách.
Lợi ích chủ yếu nằm ở cú pháp ngắn gọn và sự phù hợp khi dùng với các hàm bậc cao, trong khi hạn chế chính là khả năng biểu diễn logic phức tạp và đôi khi ảnh hưởng đến tính dễ đọc của code.
Lợi ích của hàm ẩn danh Lambda
Cú pháp ngắn gọn
Ưu điểm nổi bật nhất của hàm lambda là cú pháp cực kỳ súc tích. Nó cho phép bạn định nghĩa một hàm đơn giản chỉ trong một dòng code duy nhất, giảm bớt số lượng dòng code cần viết.
Sự gọn gàng này rất tiện lợi khi bạn cần nhanh chóng một hàm nhỏ cho một mục đích cụ thể, không muốn làm dài code bằng cách định nghĩa hàm def riêng biệt.
Dễ dàng sử dụng với Hàm bậc cao
Lambda function là lựa chọn lý tưởng khi bạn cần truyền một hàm làm đối số cho các hàm bậc cao như map(), filter(), sorted(), reduce(). Đây là trường hợp sử dụng phổ biến và hiệu quả nhất.
Khả năng định nghĩa hàm ngay tại chỗ giúp code logic mạch lạc hơn, không cần “nhảy” đến một vị trí khác để xem hàm được truyền vào làm gì.

Hạn chế của hàm ẩn danh Lambda
Giới hạn một biểu thức
Nhược điểm cốt lõi của hàm lambda là nó chỉ được phép chứa duy nhất một biểu thức. Điều này hạn chế khả năng thực hiện các logic phức tạp cần nhiều bước hoặc nhiều câu lệnh.
Bạn không thể bao gồm các câu lệnh gán, điều kiện if/else, vòng lặp for/while, hay xử lý ngoại lệ try/except trực tiếp bên trong thân hàm lambda.
Khó đọc khi quá phức tạp
Mặc dù cú pháp ngắn gọn là lợi ích, nhưng nếu biểu thức bên trong lambda trở nên quá dài hoặc lồng ghép nhiều logic, nó có thể làm giảm tính dễ đọc của code một cách đáng kể.
Thiếu tên gọi rõ ràng cũng là một yếu tố khiến hàm lambda khó hiểu hơn so với hàm def khi đọc lại code phức tạp sau này, trừ khi mục đích của nó rất rõ ràng trong ngữ cảnh sử dụng.
Khó debug hơn
Khi gặp lỗi bên trong một hàm lambda, thông báo lỗi (traceback) thường hiển thị tên hàm là ‘<lambda>’, điều này làm cho việc xác định chính xác vị trí và nguyên nhân lỗi trở nên khó khăn hơn so với khi debug một hàm def có tên.
Việc chỉ có một biểu thức cũng có thể khiến việc cô lập lỗi khó khăn hơn nếu biểu thức đó phức tạp.
Tóm lại, hàm lambda là công cụ hữu ích cho sự ngắn gọn và các tác vụ đơn giản, đặc biệt khi làm việc với hàm bậc cao. Tuy nhiên, với logic phức tạp, cần dễ đọc hoặc debug, hàm def là lựa chọn tốt hơn.
Sự khác biệt giữa hàm lambda và def từ khóa
Điểm khác biệt cơ bản nhất giữa hàm lambda và hàm bạn tạo bằng từ khóa def trong Python nằm ở cú pháp, cách sử dụng tên gọi và khả năng chứa các câu lệnh phức tạp bên trong. Nắm rõ điều này giúp bạn chọn đúng loại hàm cho từng trường hợp.
Trong khi hàm def được dùng để định nghĩa các khối mã có thể thực hiện nhiều thao tác và được đặt tên để tái sử dụng, hàm lambda tập trung vào sự ngắn gọn cho các chức năng đơn giản.
Tên gọi
Hàm được định nghĩa bằng def luôn có một tên duy nhất theo sau từ khóa def. Tên này dùng để gọi hàm khi cần thực thi và giúp mô tả mục đích của hàm trong code.
Ngược lại, hàm lambda là “ẩn danh”, tức là nó không có tên. Khi bạn định nghĩa một hàm lambda, nó trả về một đối tượng hàm mà thường bạn sẽ gán cho một biến hoặc truyền trực tiếp vào một hàm khác.
Cú pháp định nghĩa
Cú pháp của hàm def bắt đầu với def, sau đó là tên hàm, cặp ngoặc đơn chứa các tham số, dấu hai chấm và thân hàm được thụt lề bên dưới. Thân hàm có thể kéo dài nhiều dòng.
Hàm lambda có cú pháp ngắn gọn hơn đáng kể: chỉ gồm từ khóa lambda, theo sau là các đối số, dấu hai chấm và duy nhất một biểu thức. Toàn bộ định nghĩa nằm gọn trên một dòng.
Nội dung bên trong hàm
Thân của một hàm def có thể chứa bất kỳ loại câu lệnh (statement) nào của Python, bao gồm các câu lệnh gán biến, vòng lặp (for, while), cấu trúc điều kiện (if, elif, else), và cả các lệnh print hoặc raise exception.
Điểm hạn chế lớn nhất của lambda là nó chỉ được phép chứa một biểu thức (expression) duy nhất. Bạn không thể đặt các câu lệnh phức tạp hoặc nhiều dòng logic vào phần biểu thức của hàm lambda.
Xử lý giá trị trả về
Trong hàm def, bạn cần sử dụng từ khóa return một cách rõ ràng để chỉ định giá trị mà hàm sẽ trả về khi kết thúc thực thi. Nếu không có return hoặc return không kèm giá trị, hàm sẽ trả về None.
Với hàm lambda, giá trị của biểu thức duy nhất mà nó chứa sẽ được tự động trả về. Bạn không cần và không thể sử dụng từ khóa return bên trong định nghĩa lambda.
Lựa chọn giữa lambda và def phụ thuộc vào sự phức tạp của logic bạn cần thực hiện và mức độ cần thiết của việc đặt tên hàm để tái sử dụng.
Ví dụ:
# Using lambda sq = lambda x: x ** 2 print(sq(3)) # Using def def sqdef(x): return x ** 2 print(sqdef(3))
Đầu ra:
9 9
Như chúng ta có thể thấy trong ví dụ trên, cả hàm sq() và hàm sqdef() đều hoạt động giống nhau và đúng như mong đợi.
Cách sử dụng hàm Lambda
Dưới đây là những kiến thức cơ bản về cách tạo và sử dụng hàm lambda, bao gồm cú pháp và cách sử dụng chúng làm đối số trong các hàm bậc cao như map, filter và reduce.
Ngoài ra, cùng khám phá cách có thể sử dụng hàm lambda trong sắp xếp và trong hiểu biết danh sách để hiểu thêm về cách sử dụng cơ bản của hàm lambda.
Đối số trong các hàm bậc cao ( map, filter, reduce)
Các hàm lambda thường được dùng làm đối số trong các hàm bậc cao hơn như map
, filter
, và reduce
. Các hàm này cho phép bạn áp dụng một phép toán nhất định cho mọi phần tử của danh sách hoặc đối tượng lặp khác.
Ví dụ sử dụng hàm lambda với hàmmap
:
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers)
# Output: [1, 4, 9, 16, 25]
Trong ví dụ này, hàm lambda lấy một đầu vào x
và trả về bình phương của giá trị đó. map
Hàm áp dụng thao tác này cho mọi phần tử của numbers
danh sách và trả về một danh sách mới với kết quả.
Ví dụ sử dụng hàmfilter
:
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)
# Output: [2, 4]
Trong ví dụ này, hàm lambda lấy một đầu vào x
và trả về True
nếu x
là chẵn, còn False
nếu không. filter
Hàm áp dụng thao tác này cho mọi phần tử của numbers
danh sách và trả về một danh sách mới chỉ có các phần tử trả về True
.
Ví dụ sử dụng lambda vớireduce:
Hàm này reduce
là hàm bậc cao hơn lấy một hàm nhị phân (hàm lấy hai đối số) và một danh sách. Nó trả về một giá trị duy nhất là kết quả của việc áp dụng hàm nhị phân cho các phần tử của danh sách theo cách tích lũy.
Ví dụ, để tính tích của tất cả các phần tử trong một danh sách, bạn có thể sử dụng đoạn mã sau:
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x*y, numbers)
print(product)
# Output: 120
Trong ví dụ này, hàm lambda lambda x, y: x*y
được sử dụng như hàm nhị phân trong reduce
hàm. reduce
Hàm bắt đầu bằng cách áp dụng hàm nhị phân cho hai phần tử đầu tiên của danh sách, sau đó áp dụng kết quả cho phần tử tiếp theo, và cứ tiếp tục như vậy cho đến khi xử lý xong tất cả các phần tử của danh sách.

Trả về hàm dưới dạng giá trị
Bạn cũng có thể sử dụng hàm lambda để trả về hàm dưới dạng giá trị. Ví dụ:
def make_adder(x):
return lambda y: x + y
add5 = make_adder(5)
print(add5(3))
# Output: 8
Trong ví dụ này, make_adder
hàm lấy một đầu vào x
và trả về một hàm lambda lấy một đầu vào y
và trả về tổng của x
và y
. add5
Biến được gán kết quả của lệnh gọi make_adder(5)
, nghĩa là bây giờ nó tham chiếu đến một hàm lambda cộng 5 vào đầu vào của nó.
Sử dụng hàm lambda trong sắp xếp
Bạn cũng có thể sử dụng hàm lambda trong các hoạt động sắp xếp để chỉ định thứ tự sắp xếp tùy chỉnh. Ví dụ:
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers, key=lambda x: -x)
print(sorted_numbers)
# Output: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
Trong ví dụ này, hàm lambda lấy một đầu vào x
và trả về -x
, nghĩa là thứ tự sắp xếp sẽ theo thứ tự giảm dần. sorted
Hàm sắp xếp numbers
danh sách dựa trên các giá trị được trả về bởi hàm lambda.
Trường hợp sử dụng hàm Lambda trong Python phổ biến
Bạn nên xem xét sử dụng hàm lambda trong Python khi cần một hàm nhỏ, đơn giản, thực hiện một tác vụ nhanh gọn và thường là khi hàm đó không cần có tên để tái sử dụng ở nhiều nơi trong chương trình.
Hàm lambda đặc biệt hữu ích trong các tình huống mà việc định nghĩa đầy đủ một hàm bằng từ khóa def có vẻ rườm rà hoặc không cần thiết. Chúng giúp làm cho code trở nên cô đọng và dễ đọc hơn tại những điểm sử dụng cụ thể.
Sử dụng với các hàm bậc cao
Trường hợp phổ biến nhất để dùng lambda là khi truyền một hàm làm đối số cho các hàm bậc cao, tức là các hàm nhận hàm khác làm tham số. Các ví dụ điển hình là map(), filter(), và sorted().
Với các hàm này, thay vì phải định nghĩa một hàm def riêng biệt chỉ để dùng một lần duy nhất trong lệnh gọi map, filter hoặc sorted, bạn có thể định nghĩa hàm lambda ngay tại chỗ.
Ví dụ, khi sắp xếp danh sách các từ theo độ dài, bạn dùng sorted với key là lambda từ: len(tu). Lambda này cung cấp nhanh tiêu chí sắp xếp mà không cần hàm def.
Cho các hàm đơn giản, dùng ngay lập tức
Ngay cả ngoài việc kết hợp với hàm bậc cao, lambda cũng hữu ích khi bạn cần một hàm nhỏ thực hiện một phép tính duy nhất và chỉ dùng nó một lần tại một điểm cụ thể trong code.
Thay vì định nghĩa một hàm def chỉ gồm một dòng return, bạn có thể dùng lambda để tạo ra hàm đó một cách trực tiếp và ngắn gọn ngay tại vị trí bạn cần dùng.
Ví dụ, bạn có thể gán hàm lambda tính bình phương lambda x: x * 2 cho một biến và gọi biến đó như một hàm, hoặc dùng nó trong một biểu thức phức tạp hơn.
Tóm lại: Hãy chọn lambda khi hàm bạn cần là một hàm ẩn danh (không cần tên), chỉ chứa một biểu thức duy nhất, và đặc biệt khi nó được dùng làm đối số cho một hàm khác hoặc tại một vị trí duy nhất để làm code gọn hơn.
Tuy nhiên, nếu logic phức tạp hơn một biểu thức, hoặc nếu việc đặt tên cho hàm giúp code dễ đọc hơn hoặc hàm cần được tái sử dụng, hãy dùng hàm def.
Hàm ẩn danh hay Lambda Function là một công cụ mạnh mẽ trong Python cho phép tạo hàm ngắn gọn, không tên, chỉ gồm một biểu thức duy nhất. Chúng ta đã tìm hiểu cú pháp hàm ẩn danh là gì, thấy các ví dụ, phân tích lợi ích và hạn chế, cũng như sự khác biệt cốt lõi so với hàm def. Việc thành thạo cách sử dụng lambda, đặc biệt với các hàm bậc cao, sẽ giúp code Python của bạn trở nên tinh tế và hiệu quả hơn trong nhiều trường hợp.
Khi bạn đã nắm vững các công cụ mạnh mẽ trong Python như hàm lambda và sẵn sàng đưa kiến thức vào thực hành bằng cách xây dựng các ứng dụng web hoặc dịch vụ riêng, bạn sẽ cần một nơi đáng tin cậy để triển khai chúng. Đây chính là lúc dịch vụ thuê VPS trở nên thiết yếu.
Nếu bạn đang tìm kiếm một giải pháp hosting uy tín với chi phí hợp lý cho các dự án Python của mình, InterData cung cấp các gói dịch vụ Thuê VPS giá rẻ chỉ từ 95k/tháng phù hợp cho sinh viên, người mới bắt đầu hoặc các dự án cá nhân. Nhờ đầu tư vào phần cứng thế hệ mới, sử dụng CPU AMD EPYC hiệu năng cao và SSD NVMe U.2 tốc độ cao. Cấu hình mạnh mẽ này đảm bảo ứng dụng Python của bạn chạy mượt mà.
Ngoài ra, nếu bạn cần môi trường mạnh mẽ hơn, dịch vụ VPS Linux mang lại tính linh hoạt cao, cho phép bạn tùy chỉnh và quản lý server theo ý muốn, cùng với địa chỉ IP riêng. Việc khởi tạo nhanh chóng cũng giúp bạn bắt tay ngay vào dự án mà không chờ đợi.
Để hỗ trợ tốt nhất cho việc phát triển và triển khai code, VPS Linux của InterData được trang bị ổ cứng SSD Enterprise chất lượng cao cùng cấu hình mạnh mẽ, mang lại tốc độ cao và băng thông cao. Nền tảng này hướng tới sự ổn định và uy tín với 99.9% Uptime. Với mức giá rẻ chỉ từ 95K/tháng, đây là lựa chọn hiệu quả chi phí.