Lambda trong Python - Bật mí những điều bạn chưa biết về hàm Lambda
15/07/2021 02:52
Hàm ẩn danh hay còn gọi là hàm Lambda trong Python là một trong những hàm phổ biến mà lập trình viên nên tìm hiểu khi học lập trình với Python. Nếu bạn còn chưa biết biểu thức Lambda là gì, cách sử dụng chúng ra sao và cú pháp của hàm Lambda trong Python là gì thì cùng tìm hiểu ngay qua bài viết dưới đây.
Biểu thức Lambda trong Python
Biểu thức Lambda được sử dụng lý tưởng nhất khi lập trình viên cần làm một việc gì đó đơn giản. Việc hoàn thành công việc đó một cách nhanh chóng được chú trọng hơn là việc đặt tên một cách chính thức cho hàm. Biểu thức Lambda trong Python còn được gọi là hàm ẩn danh. Nói cách khác đây một cách ngắn gọn để khai báo các hàm nhỏ và ẩn danh (không cần thiết phải phải đặt tên cho các hàm Lambda). Hàm Lambda không có khả năng tái sử dụng.
Các hàm lambda hoạt động giống như các hàm thông thường được khai báo bằng từ khóa def. Chúng rất hữu ích khi bạn muốn xác định một hàm nhỏ theo cách ngắn gọn. Hàm Lambda chỉ có thể chứa một biểu thức, vì vậy chúng không phù hợp cho các hàm có câu lệnh luồng điều khiển. Lưu ý: Hàm Lambda chỉ tồn tại trong phạm vi biến mà nó được định nghĩa, nếu biến đó vượt ra khỏi phạm vi thì nó sẽ không còn tác dụng nữa.
Đặc điểm của biểu thức Lambda trong Python
Đặc biệt, một hàm lambda có các đặc điểm sau:
- Nó chỉ có thể chứa các biểu thức và không thể bao gồm các câu lệnh trong nội dung của nó.
- Nó được viết dưới dạng một dòng thực thi duy nhất.
- Nó không hỗ trợ chú thích kiểu.
- Nó có thể được gọi ngay lập tức (IIFE)
Giống như một đối tượng hàm bình thường được định nghĩa bằng def
, biểu thức lambda trong Python hỗ trợ tất cả các cách truyền đối số khác nhau. Điêu nay bao gôm:
- Đối số vị trí
- Đối số được đặt tên (đôi khi được gọi là đối số từ khóa)
- Danh sách biến đối số (thường được gọi là varargs )
- Danh sách biến các đối số từ khóa
- Đối số chỉ từ khóa
Các ví dụ sau minh họa các tùy chọn mở cho bạn để truyền đối số cho biểu thức lambda:
>>>
>>> (lambda x, y, z: x + y + z)(1, 2, 3)
6
>>> (lambda x, y, z=3: x + y + z)(1, 2)
6
>>> (lambda x, y, z=3: x + y + z)(1, y=2)
6
>>> (lambda *args: sum(args))(1,2,3)
6
>>> (lambda **kwargs: sum(kwargs.values()))(one=1, two=2, three=3)
6
>>> (lambda x, *, y=0, z=0: x + y + z)(1, y=2, z=3)
6
Cú pháp của một hàm Lambda
lambda đối số: biểu thức
Các hàm lambda có thể có nhiều đối số nhưng chỉ có một biểu thức.
Ví dụ
# Sử dụng Lambda để tính bình phương của một số
square = lambda x: x ** 2
print(square(3)) # Output: 9
# Sử dụng hàm truyền thống để tính bình phương của một số
def square1(num):
return num ** 2
print(square(5)) # Output: 25
Trong ví dụ lambda ở trên, lambda x: x ** 2 đã tạo ra một đối tượng hàm ẩn danh có thể được liên kết với bất kỳ tên nào. Vì vậy, ở ví dụ tên ta đã liên kết đối tượng hàm với square. Vì vậy, từ bây giờ chúng ta có thể gọi đối tượng square giống như bất kỳ hàm truyền thống nào, chẳng hạn square(10)
>>> Tham khảo: Khóa học lập trình Python
Sử dụng hàm Lambda với filter ()
Hàm filter() trong Python lọc ra các phần tử theo điều kiện của hàm func từ list, dict... Hàm này sẽ chỉ trả về những giá trị mà điều kiện trong func chấp nhận (có nghĩa là True)
Ví dụ:
Sử dụng filter() thông thường
my_list = [1, 2, 3, 4, 5]
def so_chan(number):
if number % 2 == 0:
return True
else:
return False
print filter(so_chan, my_list) # [2,4]
Sử dụng hàm Lambda
print filter(lambda x: x%2 ==0, my_list)# [2,4]
>>> Đọc thêm: Python Seaborn - Nắm rõ cách sử dụng thư viện Seaborn của Python
Sử dụng hàm Lambda với reduce ()
Hàm Reduce () trong Python nhận một hàm và một danh sách làm đối số. Đây không phải một hàm tích hợp sẵn trong Python mà nằm trong package functools. Hàm reduce sẽ tính toán giá trị các tham số và sau đó trả về kết quả.
Ví dụ sử dụng hàm Lambda với reduce
# Python code to illustrate
# map() with lambda()
# to get double of a list.
li = [5, 7, 22, 97, 54, 62, 77, 23, 73, 61]
final_list = list(map(lambda x: x*2 , li))
print(final_list)
Kiểm tra Lambda trong Python
Các lambdas trong Python có thể được kiểm tra tương tự như các hàm thông thường. Có thể sử dụng cả hai unittest
và doctest
.
unittest
Các unittest
mô-đun xử lý các hàm lambda Python tương tự như chức năng thường xuyên:
import unittest addtwo = lambda x: x + 2 class LambdaTest(unittest.TestCase): def test_add_two(self): self.assertEqual(addtwo(2), 4) def test_add_two_point_two(self): self.assertEqual(addtwo(2.2), 4.2) def test_add_three(self): # Should fail self.assertEqual(addtwo(3), 6) if __name__ == '__main__': unittest.main(verbosity=2)
LambdaTest
định nghĩa một trường hợp thử nghiệm với ba phương pháp thử nghiệm, mỗi phương pháp trong số chúng thực hiện một kịch bản thử nghiệm để được addtwo()
triển khai dưới dạng một hàm lambda. Việc thực thi tệp Python lambda_unittest.py
có chứa LambdaTest
tạo ra như sau:
$ python lambda_unittest.py test_add_three (__main__.LambdaTest) ... FAIL test_add_two (__main__.LambdaTest) ... ok test_add_two_point_two (__main__.LambdaTest) ... ok ====================================================================== FAIL: test_add_three (__main__.LambdaTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "lambda_unittest.py", line 18, in test_add_three self.assertEqual(addtwo(3), 6) AssertionError: 5 != 6 ---------------------------------------------------------------------- Ran 3 tests in 0.001s FAILED (failures=1)
>>> Đọc thêm: Các loại toán tử trong Python mà lập trình viên nào cũng nên nằm lòng
Ưu điểm và nhược điểm khi sử dụng hàm Lambda trong Python
Ưu điểm: Hàm Lambda sẽ giúp việc lập trình trong Python trở nên tinh gọn và tối ưu hơn. Đặc biệt khi bạn cần xử lý logic tại một điểm nhất định trong thời gian ngắn.
Nhược điểm: Khi sử dụng hàm Lambda việc debug và bảo trì sẽ khó khăn hơn.
Kết luận: Hàm Lambda là một trong những hàm phổ biến sử dụng trong Python. Bạn có thể sử dụng hàm Lambda để lập trình một cách nhanh chóng và hiệu quả hơn.
>>> Đọc thêm các thông tin hữu về các ngôn ngữ lập trình tại Viện công nghệ thông tin T3H