Biểu thức lambda này xác định một hàm không tên, hàm này chấp nhận hai đối số và trả về tổng của hai đối số. Nhưng làm thế nào để chúng ta gọi một chức năng chưa được đặt tên? .
[lambda x, y: x + y][1, 2]
mã 1.
Python3
[lambda x, y: x + y][1, 2]9
9 20
9 21
9 22_______2_______3
9 24
9 25
9 26
9 27
9 28
9 29
110
111
112
113
112
115
116
117_______12_______8
119
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]0_______2_______3
9 24
9 25
9 26
9 27
9 28
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]8
9 23
9 23
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]1
116
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]3
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]4
9 29
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]6_______12_______1_______12_______2_______2_______2_______2_______12_______2_______12_______2_______12_______2_______1
117_______46_______4
đầu ra.
9 2
Mặc dù điều này không được khuyến khích nhưng đối tượng hàm được trả về bởi biểu thức lambda có thể được gán cho một biến. Xem ví dụ bên dưới trong đó một biến sum được gán cho một đối tượng hàm được trả về bởi một biểu thức lambda.
Python3
55
56
57
58
59
9 23
9 25
52
9 27
54
117_______2_______4
57
9 24
59
three0
9 22
9 23
59
9 24_______63_______5
112
three7
116
117_______12_______8
đầu ra.
11
Cách sử dụng phổ biến của biểu thức lambda.
- Vì các hàm lambda là ẩn danh và không yêu cầu gán tên nên chúng thường được sử dụng để gọi các hàm [hoặc lớp] yêu cầu một đối tượng hàm làm đối số. Việc định nghĩa các hàm riêng biệt cho các đối số hàm như vậy là vô ích vì định nghĩa hàm thường ngắn và chúng chỉ được yêu cầu một hoặc hai lần trong mã. Ví dụ: đối số chính của hàm sẵn có, sorted[].
Python3
55
three2
three3
three4
three5
three6
three7
three8
113
[lambda x, y: x + y][1, 2]00
9 23
[lambda x, y: x + y][1, 2]02
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]1
112
111
112
113
112
115
112
three5
112
[lambda x, y: x + y][1, 2]13
112
[lambda x, y: x + y][1, 2]15
112
three7
112
[lambda x, y: x + y][1, 2]19
112
[lambda x, y: x + y][1, 2]21
[lambda x, y: x + y][1, 2]22
[lambda x, y: x + y][1, 2]23
9 23
[lambda x, y: x + y][1, 2]25
[lambda x, y: x + y][1, 2]26
9 23
[lambda x, y: x + y][1, 2]28
117_______0_______30
- đầu ra
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
Python3
[lambda x, y: x + y][1, 2]31
[lambda x, y: x + y][1, 2]32
[lambda x, y: x + y][1, 2]00
9 23
[lambda x, y: x + y][1, 2]02
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]1
112
111
112
113
112
115
112
three5
112
[lambda x, y: x + y][1, 2]13
112
[lambda x, y: x + y][1, 2]15
112
three7
112
[lambda x, y: x + y][1, 2]19
112
[lambda x, y: x + y][1, 2]21
[lambda x, y: x + y][1, 2]22
[lambda x, y: x + y][1, 2]56
9 23
[lambda x, y: x + y][1, 2]25_______0_______26_______2_______3
9 25
[lambda x, y: x + y][1, 2]62
three8
113
116
117____0_______67
- đầu ra
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
- Các hàm lambda là các hàm nội tuyến và do đó chúng được sử dụng bất cứ khi nào có nhu cầu gọi hàm lặp lại để giảm thời gian thực hiện. Một số ví dụ về các tình huống như vậy là các chức năng. bản đồ [], bộ lọc [] và sắp xếp []. Ví dụ,
Python3
[lambda x, y: x + y][1, 2]9
[lambda x, y: x + y][1, 2]32
[lambda x, y: x + y][1, 2]00
9 23
[lambda x, y: x + y][1, 2]02
111
112
113
112
115
112
three5
112
[lambda x, y: x + y][1, 2]13
112
[lambda x, y: x + y][1, 2]15
112
three7
112
[lambda x, y: x + y][1, 2]19
112
[lambda x, y: x + y][1, 2]21
112
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]1
[lambda x, y: x + y][1, 2]22
[lambda x, y: x + y][1, 2]93
[lambda x, y: x + y][1, 2]94_______2_______3
[lambda x, y: x + y][1, 2]96
9 24
9 25
[lambda x, y: x + y][1, 2]62
9 29
9 201
117_______2_______4
9 204
9 205
9 206
9 207
9 23
9 209
9 24_______2_______5
9 212
9 213
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]4
three8
113
9 23
9 23
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]1
116
9 222_______22_______3
9 224
9 225
117_______2_______4
9 204
9 229
Ưu và nhược điểm của hàm lambda.
Ưu điểm của hàm lambda.
- Là ẩn danh, các hàm lambda có thể dễ dàng được chuyển mà không cần gán cho một biến
- Các hàm lambda là các hàm nội tuyến và do đó thực thi tương đối nhanh hơn
- Nhiều khi các hàm lambda làm cho mã dễ đọc hơn nhiều bằng cách tránh các bước nhảy logic do các lệnh gọi hàm gây ra. Ví dụ: đọc các khối mã sau.
Python3
9 230
9 231
three3
9 233
three5
three6
three7
9 29_______46_______4
9 27
9 240
9 241_______2_______3
111
9 244
9 23
113
9 247_______2_______3
115
9 250
9 251_______2_______3
9 253
117_______2_______55
- đầu ra
5
Python3
9 230
9 257
9 251
9 23
9 24
9 25
9 262
9 29
54
9 27
110
111
112
113
112
115
116
117_______2_______74
- đầu ra
5
Nhược điểm về chức năng lambda.
- Các hàm lambda chỉ có thể có một biểu thức
- Hàm lambda không thể có chuỗi tài liệu
- Nhiều lần các hàm lambda làm cho mã khó đọc. Ví dụ: xem các khối mã được cung cấp bên dưới.
Python3
three3
9 276
three5
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
three7_______2_______3_______2_______3
111
9 283
9 284
three6
9 286
three5
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]3
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
three7
9 23
9 23
113
9 283
9 284
three6
9 297
three5
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]3
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
three7
9 23
9 23
115
9 283
9 284
three6
1108
three5
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]3
9 283
9 284
three6
1114
1115_______2_______3
1117
115_______12_______6
117_______12_______21
- đầu ra
three
Python3
[lambda x, y: x + y][1, 2]31
[lambda x, y: x + y][1, 2]32
1115_______2_______3
9 24
9 25
9 212
9 286
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
three7
9 23
9 23
111
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]3
9 24
9 297
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
three7
9 23_______2_______3
113
1143
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]3
9 24
1108
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
three7
9 23
9 23
115
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]3
1114
1154
115
116
117_______12_______21
- đầu ra
three
Lạm dụng biểu thức Lambda.
- Gán các biểu thức lambda. Hướng dẫn kiểu python chính thức PEP8, không khuyến khích mạnh mẽ việc gán các biểu thức lambda như trong ví dụ bên dưới
[lambda x, y: x + y][1, 2]0
- Thay vào đó, nên viết một hàm một lớp như,
[lambda x, y: x + y][1, 2]1
- Mặc dù phương pháp thứ hai khuyến khích thực tế là các hàm lambda là ẩn danh, nhưng nó cũng hữu ích cho việc truy nguyên trong quá trình gỡ lỗi. Chạy mã bên dưới để xem cách def làm cho truy nguyên trở nên hữu ích.
Python3
1159
9 23
9 25
9 262_______2_______9
54
9 27
9 240
117_______12_______68
three3
1170
three6
three7
9 29
54
9 27
9 240
117_______12_______68
- Gói các biểu thức lambda xung quanh các chức năng. Nhiều lần, các biểu thức lambda không cần thiết bao quanh các chức năng như hình bên dưới
[lambda x, y: x + y][1, 2]2
- Mặc dù cú pháp trên là hoàn toàn chính xác, nhưng các lập trình viên phải hiểu rằng tất cả các hàm trong python đều có thể được truyền dưới dạng các đối tượng hàm. Do đó, cùng một mã có thể [và nên] được viết là,
[lambda x, y: x + y][1, 2]3
- Truyền chức năng không cần thiết. Nhiều lần, người lập trình chuyển các hàm chỉ thực hiện một thao tác duy nhất. Xem đoạn mã sau
[lambda x, y: x + y][1, 2]4
- Hàm lambda được truyền ở trên chỉ thực hiện một thao tác duy nhất, thêm hai đối số. Có thể thu được kết quả tương tự bằng cách sử dụng hàm tích hợp sẵn sum, như minh họa bên dưới.
[lambda x, y: x + y][1, 2]5
- Các lập trình viên nên tránh sử dụng các biểu thức lambda cho các hoạt động phổ biến, bởi vì rất có thể có một hàm tích hợp cung cấp kết quả tương tự
Lạm dụng các biểu thức lambda.
- Sử dụng lambda cho các chức năng không tầm thường. Đôi khi, các chức năng đơn giản có thể không tầm thường. Xem mã dưới đây
Python3
1179_______2_______3
1181
1182
9 283
1184
112
1186
9 283
1188
112
1190
9 283
113
112_______12_______94__
9 283_______6
1198
1199
1182
9 283
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]02
112
1186
9 283
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]06
112
1190
9 283
111
112
1194_____2_______83_______1_______ 7
1198
1199
1182_______2_______83
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]20
112
1186
9 283
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]24
112
1190
9 283
[lambda x, y: x + y][1, 2]13
112
1194_____2_
113
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]34
9 23
[lambda x, y: x + y][1, 2]25
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]37
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]38_______22_______39
9 23
9 25
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]42
1182
[lambda x, y: x + y][1, 2]22
9 29
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]46
111
9 27
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]49
1186
[lambda x, y: x + y][1, 2]22
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]52
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]53_______22_______49
1190
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]56
9 29
9 29
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]59
1190
[lambda x, y: x + y][1, 2]22
9 29
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]49
1194
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]65
117_______22_______67
- đầu ra
[{'N'. 2, 'r'. 0. 01, ‘t’. 4, 'p'. 100}, {‘n’. 5, 'r'. 0. 05, ‘t’. 2, 'p'. 120}, {‘n’. 1, 'r'. 0. 04, ‘t’. 5, 'p'. 150}]
- Ở đây, chúng tôi đang sắp xếp các từ điển trên cơ sở lãi kép. Bây giờ, hãy xem mã được viết bên dưới, sử dụng def
Python3
1179_______2_______3
1181
1182
9 283
1184
112
1186
9 283
1188
112
1190
9 283
113
112_______12_______94__
9 283_______6
1198
1199
1182
9 283
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]02
112
1186
9 283
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]06
112
1190
9 283
111
112
1194_____2_______83_______1_______ 7
1198
1199
1182_______2_______83
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]20
112
1186
9 283
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]24
112
1190
9 283
[lambda x, y: x + y][1, 2]13
112
1194_____2_
113
three3
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]24
three5
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]26
three5
three6
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]29
1182
[lambda x, y: x + y][1, 2]22
9 29
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]46
111
9 27
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]29
1186
[lambda x, y: x + y][1, 2]22
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]52
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]29
1190
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]56
9 29
9 29
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]45
1190
[lambda x, y: x + y][1, 2]22
9 29
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]29
1194
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]51
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]34
9 23
[lambda x, y: x + y][1, 2]25
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]55
9 23
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]57
117_______22_______67
- đầu ra
[{'N'. 2, 'r'. 0. 01, ‘t’. 4, 'p'. 100}, {‘n’. 5, 'r'. 0. 05, ‘t’. 2, 'p'. 120}, {‘n’. 1, 'r'. 0. 04, ‘t’. 5, 'p'. 150}]
- Mặc dù cả hai mã đều làm giống nhau, mã thứ hai sử dụng def dễ đọc hơn nhiều. Biểu thức được viết ở đây dưới lambda có thể đơn giản, nhưng nó có ý nghĩa [công thức tính lãi kép]. Do đó, biểu thức là không tầm thường và xứng đáng được đặt tên. Sử dụng các biểu thức lambda cho các chức năng không tầm thường làm giảm khả năng đọc mã
- Sử dụng lambdas khi nhiều dòng sẽ hữu ích. Nếu sử dụng hàm nhiều dòng giúp mã dễ đọc hơn, thì việc sử dụng biểu thức lambda để giảm bớt một số dòng mã là không đáng. Ví dụ, xem đoạn mã dưới đây
người = [['sam', 'M', 18], ['susan', 'F', 22], ['joy', 'M', 21], ['lucy', 'F', 12]
sorted_people = đã sắp xếp [mọi người, key=lambda x. x[1]]
- Cũng xem đoạn mã sau sử dụng def
[lambda x, y: x + y][1, 2]6
- Xem cách giải nén bộ dữ liệu trong khối mã thứ hai giúp nó dễ đọc và hợp lý hơn nhiều. Khả năng đọc mã phải là ưu tiên hàng đầu của lập trình viên, làm việc trong môi trường hợp tác
- Sử dụng biểu thức lambda cho bản đồ và bộ lọc. Lambdas thường được sử dụng với map[] và filter[] như hình minh họa
Python3
[lambda x, y: x + y][1, 2]00
9 23
[lambda x, y: x + y][1, 2]02
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]1
112
111
112
113
112
115
112
three5
112
[lambda x, y: x + y][1, 2]13
[lambda x, y: x + y][1, 2]22
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]75
9 23
[lambda x, y: x + y][1, 2]96
9 24
9 25
[lambda x, y: x + y][1, 2]62
9 29
9 201
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]83_______2_______3
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]4
520
three7
522
[lambda x, y: x + y][1, 2]00
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]7
three7
three8
113
9 23
9 23
111
116