Khi tôi lần đầu tiên bắt gặp các hàm lambda trong python, tôi đã rất lo lắng và nghĩ rằng chúng dành cho Pythonistas nâng cao. Hướng dẫn về python cho người mới bắt đầu hoan nghênh ngôn ngữ này vì cú pháp dễ đọc của nó, nhưng chắc chắn lambdas có vẻ không thân thiện với người dùng
Tuy nhiên, khi tôi đã hiểu cú pháp chung và kiểm tra một số trường hợp sử dụng đơn giản, việc sử dụng chúng sẽ bớt đáng sợ hơn
cú pháp
Nói một cách đơn giản, hàm lambda cũng giống như bất kỳ hàm python bình thường nào, ngoại trừ việc nó không có tên khi định nghĩa và nó được chứa trong một dòng mã
lambda argument[s]: expression
Hàm lambda đánh giá một biểu thức cho một đối số đã cho. Bạn cung cấp cho hàm một giá trị [đối số] và sau đó cung cấp thao tác [biểu thức]. Từ khóa
#Normal python function5 phải đứng đầu. Dấu hai chấm đầy đủ [. ] ngăn cách đối số và biểu thức
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
Trong mã ví dụ bên dưới, x là đối số và x+x là biểu thức
#Normal python function
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
Trước khi chúng ta đi vào các ứng dụng thực tế, hãy đề cập đến một số kỹ thuật về những gì cộng đồng python nghĩ là tốt và xấu với các hàm lambda
ưu
- Tốt cho các hoạt động logic đơn giản, dễ hiểu. Điều này cũng làm cho mã dễ đọc hơn
- Tốt khi bạn muốn một chức năng mà bạn sẽ chỉ sử dụng một lần
Nhược điểm
- Họ chỉ có thể thực hiện một biểu thức. Không thể có nhiều thao tác độc lập trong một hàm lambda
- Không phù hợp với các hoạt động kéo dài nhiều hơn một dòng trong một hàm
#Normal python function
6 bình thường [Ví dụ: các hoạt động có điều kiện lồng nhau]. Nếu bạn cần một hoặc hai phút để hiểu mã, thay vào đó hãy sử dụng hàm có tên
def a_name[x]:
return x+x#Lambda function
lambda x: x+x - Không tốt vì bạn không thể viết một chuỗi tài liệu để giải thích tất cả các đầu vào, hoạt động và đầu ra như bạn làm trong một hàm
#Normal python function
6 bình thường
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
Ở cuối bài viết này, chúng ta sẽ xem xét các ví dụ về mã thường được sử dụng trong đó hàm Lambda không được khuyến khích mặc dù chúng có vẻ hợp pháp
Nhưng trước tiên, hãy xem xét các tình huống khi sử dụng hàm lambda. Lưu ý rằng chúng tôi sử dụng các hàm lambda rất nhiều với các lớp python nhận một hàm làm đối số, ví dụ: map[] và filter[]. Chúng còn được gọi là các hàm bậc cao hơn
1. giá trị vô hướng
Đây là khi bạn thực thi hàm lambda trên một giá trị
[lambda x: x*2][12]###Results
24
Trong đoạn mã trên, hàm đã được tạo và sau đó được thực thi ngay lập tức. Đây là một ví dụ về biểu thức hàm được gọi ngay lập tức hoặc IIFE
2. danh sách
Lọc[]. Đây là thư viện sẵn có của Python chỉ trả về những giá trị phù hợp với tiêu chí nhất định. Cú pháp là
#Normal python function8. Iterable có thể là bất kỳ trình tự nào, chẳng hạn như đối tượng danh sách, tập hợp hoặc chuỗi [thêm bên dưới]
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
Ví dụ bên dưới lọc danh sách cho _______1_______9 số. Lưu ý rằng hàm bộ lọc trả về một ‘Đối tượng bộ lọc’ và bạn cần đóng gói nó bằng một danh sách để trả về các giá trị
________số 8_______Bản đồ[]. Đây là một thư viện python có sẵn khác với cú pháp
[lambda x: x*2][12]###Results0
24
Điều này trả về một danh sách đã sửa đổi trong đó mọi giá trị trong danh sách ban đầu đã được thay đổi dựa trên một hàm. Ví dụ dưới đây chia khối mọi số trong danh sách
list_1 = [1,2,3,4,5,6,7,8,9]
cubed = map[lambda x: pow[x,3], list_1]
list[cubed]###Results
[1, 8, 27, 64, 125, 216, 343, 512, 729]
3. đối tượng sê-ri
A là một cột trong khung dữ liệu, hay nói cách khác, một chuỗi các giá trị với các chỉ số tương ứng. Các hàm lambda có thể được sử dụng để thao tác các giá trị bên trong khung dữ liệu Pandas
Hãy tạo một khung dữ liệu giả về các thành viên trong một gia đình
import pandas as pddf = pd.DataFrame[{
'Name': ['Luke','Gina','Sam','Emma'],
'Status': ['Father', 'Mother', 'Son', 'Daughter'],
'Birthyear': [1976, 1984, 2013, 2016],
}]
Lambda với hàm Apply[] của Pandas. Hàm này áp dụng một thao tác cho mọi phần tử của cột
Để biết tuổi hiện tại của mỗi thành viên, chúng ta lấy năm hiện tại trừ đi năm sinh của họ. Trong hàm lambda bên dưới, x tham chiếu đến một giá trị trong cột năm sinh và biểu thức là
[lambda x: x*2][12]###Results1
24
df['age'] = df['Birthyear'].apply[lambda x: 2021-x]
Lambda với hàm Filter[] của Python. Điều này có 2 đối số; . Nó trả về một danh sách các giá trị thỏa mãn điều kiện
list[filter[lambda x: x>18, df['age']]]###Results
[45, 37]
Lambda với hàm Map[] của Pandas. Map hoạt động rất giống với apply[] ở chỗ nó sửa đổi các giá trị của một cột dựa trên biểu thức
#Double the age of everyonedf['double_age'] =
df['age'].map[lambda x: x*2]
Chúng tôi cũng có thể thực hiện các hoạt động có điều kiện trả về các giá trị khác nhau dựa trên các tiêu chí nhất định
Mã bên dưới trả về 'Nam' nếu giá trị Trạng thái là cha hoặc con và trả về 'Nữ' nếu không. Lưu ý rằng
[lambda x: x*2][12]###Results2 và
24
[lambda x: x*2][12]###Results3 có thể hoán đổi cho nhau trong ngữ cảnh này
24
#Conditional Lambda statementdf['Gender'] = df['Status'].map[lambda x: 'Male' if x=='father' or x=='son' else 'Female']
4. Lambda trên đối tượng Dataframe
Tôi chủ yếu sử dụng các hàm Lambda trên các cột cụ thể [đối tượng chuỗi] thay vì toàn bộ khung dữ liệu, trừ khi tôi muốn sửa đổi toàn bộ khung dữ liệu bằng một biểu thức
Ví dụ: làm tròn tất cả các giá trị đến 1 chữ số thập phân, trong trường hợp đó, tất cả các cột phải là kiểu dữ liệu float hoặc int vì round[] không thể hoạt động trên chuỗi
#Normal python function0
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
Trong ví dụ dưới đây, chúng tôi sử dụng áp dụng trên khung dữ liệu và chọn các cột để sửa đổi trong hàm Lambda. Lưu ý rằng chúng ta phải sử dụng
[lambda x: x*2][12]###Results4 ở đây để biểu thức được áp dụng theo cột
24
#Normal python function1
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
Trường hợp sử dụng không được khuyến khích
- Gán tên cho hàm Lambda. Điều này không được khuyến khích trong hướng dẫn kiểu python PEP8 vì Lambda tạo một chức năng ẩn danh không có nghĩa là được lưu trữ. Thay vào đó, hãy sử dụng hàm
#Normal python function
6 bình thường nếu bạn muốn lưu trữ hàm để sử dụng lại
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
#Normal python function2
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
2. Truyền hàm bên trong hàm Lambda. Việc sử dụng các hàm như
[lambda x: x*2][12]###Results6 chỉ nhận một đối số số là không cần thiết với Lambda vì bạn có thể chuyển trực tiếp hàm vào map[] hoặc apply[]
24
#Normal python function3
def a_name[x]:
return x+x#Lambda function
lambda x: x+x
Lý tưởng nhất là các hàm bên trong các hàm lambda nên có hai đối số trở lên. Ví dụ là
[lambda x: x*2][12]###Results7 và
24
[lambda x: x*2][12]###Results8 Bạn có thể thử nghiệm với nhiều hàm python tích hợp khác nhau để xem hàm nào cần hàm Lambda trong ngữ cảnh này. Tôi đã làm như vậy trong sổ ghi chép này
24
3. Sử dụng các hàm Lambda khi nhiều dòng mã dễ đọc hơn. Một ví dụ là khi bạn đang sử dụng câu lệnh if-else bên trong hàm lambda. Tôi đã sử dụng ví dụ dưới đây trước đó trong bài viết này
#Conditional Lambda statementdf['Gender'] = df['Status'].map[lambda x: 'Male' if x=='father' or x=='son' else 'Female']
Kết quả tương tự có thể đạt được với mã dưới đây. Tôi thích cách này hơn vì bạn có thể có vô số điều kiện và mã đủ đơn giản để làm theo. Thông tin thêm về các điều kiện vector hóa tại đây
Phần kết luận
Nhiều lập trình viên không thích Lambdas thường lập luận rằng bạn có thể thay thế chúng bằng cách hiểu danh sách dễ hiểu hơn, hàm tích hợp và thư viện chuẩn. Các biểu thức trình tạo [tương tự như hiểu danh sách] cũng là các lựa chọn thay thế hữu ích cho các hàm map[] và filter[]
Cho dù bạn có quyết định sử dụng các hàm Lambda trong mã của mình hay không, bạn cần hiểu chúng là gì và chúng được sử dụng như thế nào vì chắc chắn bạn sẽ bắt gặp chúng trong mã của người khác