Lambda là một loại hàm không tên (anonymous function) được sử dụng để định nghĩa một hàm nhanh chóng mà không cần phải định nghĩa một hàm riêng. Lambda thường được sử dụng để định nghĩa các hàm đơn giản, được sử dụng như đối số của các hàm khác hoặc được trả về từ một hàm khác.
Cú pháp khai báo lambda như sau:
lambda arguments : expression
Trong đó:
arguments
: danh sách các đối số được truyền vào hàm lambda, được phân tách bằng dấu phẩy (tương tự như trong khai báo hàm thông thường)expression
: biểu thức được thực thi bởi hàm lambda
Sau đây là một ví dụ minh hoạ cho lambda:
# Định nghĩa hàm lambda để tính bình phương của một số
square = lambda x: x ** 2
# Sử dụng hàm lambda để tính bình phương của số 5
print(square(5)) # Output: 25
Trong ví dụ trên, hàm lambda được sử dụng để tính bình phương của một số. Biểu thức lambda x: x ** 2
định nghĩa hàm lambda, nhận vào một đối số là x
và trả về giá trị bình phương của x
. Hàm lambda này được lưu trữ vào biến square
. Sau đó, chúng ta gọi hàm square
với đối số là số 5 và in ra kết quả là 25.
Ví dụ 1:
Ví dụ sau minh hoạ cách sử dụng lambda như một đối số của một hàm khác. Trong ví dụ này, chúng ta sẽ sử dụng hàm sorted()
để sắp xếp một danh sách các chuỗi, và sử dụng lambda như một đối số để chỉ định cách sắp xếp.
names = ['Alice', 'bob', 'Charlie', 'David']
sorted_names = sorted(names, key=lambda x: x.lower())
print(sorted_names)
Kết quả khi chạy đoạn code trên sẽ là:
['Alice', 'bob', 'Charlie', 'David']
Ở đây, chúng ta truyền một hàm lambda như là đối số thứ hai cho hàm sorted()
. Lambda này sẽ nhận vào một tham số x
(trong trường hợp này là một chuỗi), và trả về giá trị tương ứng với chuỗi đó khi chuyển thành chữ thường. Như vậy, các chuỗi sẽ được sắp xếp theo thứ tự bảng chữ cái, bao gồm cả chữ hoa và chữ thường.
Trong ví dụ này, chúng ta sử dụng lambda để định nghĩa một hàm nặc danh (anonymous function) để sử dụng chỉ trong phạm vi của hàm sorted()
. Hàm lambda được truyền vào hàm sorted()
là một hàm có một tham số x
và trả về giá trị là x.lower()
để chuyển đổi chuỗi đầu vào thành chuỗi viết thường, sau đó sử dụng kết quả để sắp xếp danh sách.
Ví dụ 2:
Sử dụng lambda để sắp xếp danh sách các tuple theo phần tử thứ hai của mỗi tuple.
Trong ví dụ này, chúng ta có một danh sách các tuple đại diện cho tên và điểm số của một số học sinh. Chúng ta muốn sắp xếp danh sách này theo điểm số (phần tử thứ hai của mỗi tuple).
students = [("John", 90), ("Mary", 85), ("Tom", 95), ("Adam", 80)]
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
print(sorted_students)
Kết quả sẽ là:
[('Tom', 95), ('John', 90), ('Mary', 85), ('Adam', 80)]
Trong đoạn code trên, chúng ta sử dụng hàm sorted
để sắp xếp danh sách students
. Tham số key
của hàm sorted
được sử dụng để chỉ định phương thức sắp xếp. Trong trường hợp này, chúng ta sử dụng lambda để chỉ định rằng chúng ta muốn sắp xếp danh sách theo phần tử thứ hai của mỗi tuple (x[1]
). Tham số reverse=True
được sử dụng để sắp xếp danh sách theo thứ tự giảm dần (từ điểm số cao nhất đến thấp nhất).
Ví dụ 3:
Ví dụ về lambda trong quản trị hệ thống Linux là khi ta muốn xử lý một danh sách các file, với mỗi file ta muốn in ra tên file cùng với kích thước của file đó, sử dụng hàm os.path.getsize()
để lấy kích thước của file:
import os
files = os.listdir('.') # Lấy danh sách file trong thư mục hiện tại
file_info = map(lambda f: (f, os.path.getsize(f)), files) # Lấy thông tin tên và kích thước file
for name, size in file_info:
print(f"{name}: {size} bytes")
Ở đây, chúng ta sử dụng hàm map()
để áp dụng một hàm lambda cho mỗi phần tử trong danh sách các file. Hàm lambda này nhận đối số là tên của file và trả về một tuple gồm tên file và kích thước file được lấy bằng hàm os.path.getsize()
. Kết quả trả về từ hàm map()
là một iterator chứa các tuple tương ứng với từng file. Cuối cùng, chúng ta sử dụng một vòng lặp để in ra tên và kích thước của từng file.
Kết quả khi chạy chương trình trên Linux sẽ hiển thị danh sách tất cả các file và thư mục trong thư mục hiện tại, bao gồm cả các file và thư mục ẩn, sắp xếp theo thứ tự tăng dần theo tên file. Ví dụ:
./script.py
.git/
.gitignore
README.md
script.py
test/
Lưu ý rằng kết quả này sẽ khác nhau tùy thuộc vào thư mục hiện tại mà bạn đang chạy chương trình.