Các hàm
def add[x,y]:
return x + y
8, def add[x,y]:
return x + y
9 và lambda x, y: x + y
0 mang lại một chút lập trình hàm cho Python. Cả ba hàm này đều là các hàm tiện lợi có thể được thay thế bằng các vòng lặp hoặc Hiểu danh sách, nhưng cung cấp một cách tiếp cận ngắn gọn và thanh lịch hơn cho một số vấn đềTrước khi tiếp tục, chúng ta sẽ điểm qua một số điều bạn nên làm quen trước khi đọc về các phương pháp nói trên
Hàm/phương thức ẩn danh hoặc lambda là gì?
Một phương thức ẩn danh là một phương thức không có tên, tôi. e. không bị ràng buộc với một mã định danh như khi chúng ta định nghĩa một phương thức bằng cách sử dụng
lambda x, y: x + y
1Ghi chú. Mặc dù hầu hết mọi người sử dụng thuật ngữ "hàm ẩn danh" và "hàm lambda" thay thế cho nhau - chúng không giống nhau. Lỗi này xảy ra bởi vì trong hầu hết các ngôn ngữ lập trình, lambda đều ẩn danh và tất cả các hàm ẩn danh đều là lambda. Đây cũng là trường hợp trong Python. Vì vậy, chúng ta sẽ không đi sâu vào sự khác biệt này trong bài viết này.
Cú pháp của hàm lambda [hoặc toán tử lambda] là gì?
lambda arguments: expression
Hãy nghĩ về lambdas như các phương thức một dòng không có tên. Ví dụ, chúng hoạt động giống như bất kỳ phương thức nào khác trong Python
def add[x,y]:
return x + y
Có thể được dịch sang
lambda x, y: x + y
Lambda khác với các phương thức Python thông thường vì chúng chỉ có thể có một biểu thức, không thể chứa bất kỳ câu lệnh nào và kiểu trả về của chúng là đối tượng
lambda x, y: x + y
2. Vì vậy, dòng mã trên không trả về chính xác giá trị lambda x, y: x + y
3 mà là hàm tính toán lambda x, y: x + y
3Tại sao lambda lại liên quan đến
8,def add[x,y]: return x + y
9 vàdef add[x,y]: return x + y
0?lambda x, y: x + y
Cả ba phương thức này đều mong đợi một đối tượng
lambda x, y: x + y
2 làm đối số đầu tiên. Đối tượng lambda x, y: x + y
2 này có thể là một phương thức được xác định trước với một tên [như def add[x,y]:
return x + y
50]Mặc dù, thường xuyên hơn không, các hàm được truyền cho
def add[x,y]:
return x + y
8, def add[x,y]:
return x + y
9 và lambda x, y: x + y
0 là những hàm bạn chỉ sử dụng một lần, do đó, thường không có ích gì khi xác định hàm có thể tham chiếuĐể tránh xác định một chức năng mới cho các nhu cầu khác nhau của bạn về
def add[x,y]:
return x + y
8/def add[x,y]:
return x + y
9/lambda x, y: x + y
0 - một giải pháp tinh tế hơn sẽ là sử dụng một chức năng ẩn danh, dùng một lần, ngắn mà bạn sẽ chỉ sử dụng một lần và không bao giờ sử dụng lại - lambdaHàm map[]
Hàm
def add[x,y]:
return x + y
8 lặp qua tất cả các mục trong iterable đã cho và thực thi lambda x, y: x + y
2 mà chúng tôi đã chuyển làm đối số cho từng mụcCú pháp là
def add[x,y]:
return x + y
5Chúng ta có thể truyền bao nhiêu đối tượng có thể lặp tùy ý sau khi truyền
lambda x, y: x + y
2 mà chúng ta muốn sử dụngMã này sẽ dẫn đến
lambda x, y: x + y
6Như chúng ta có thể thấy, chúng ta đã kết thúc với một danh sách mới trong đó hàm
lambda x, y: x + y
60 được đánh giá cho từng phần tử trong danh sách lambda x, y: x + y
61. Kết quả của chức năng này đã được thêm vào danh sách một cách tuần tựMột cách hay hơn để làm điều tương tự chính xác này là sử dụng lambdas
lambda x, y: x + y
9Chúng tôi nhận được cùng một đầu ra
lambda x, y: x + y
6Ghi chú. Bạn có thể nhận thấy rằng chúng tôi đã truyền
lambda x, y: x + y
62 vào một danh sách để in giá trị của từng phần tử. Chúng tôi đã làm điều này bởi vì gọi lambda x, y: x + y
63 trong danh sách sẽ in các giá trị thực của các phần tử. Thay vào đó, gọi lambda x, y: x + y
63 trên lambda x, y: x + y
62 sẽ in địa chỉ bộ nhớ của các giá trịHàm
def add[x,y]:
return x + y
8 trả về loại lambda x, y: x + y
62, có thể lặp lại và chúng tôi cũng có thể in kết quả như thế nàylambda x, y: x + y
7Thay vào đó, nếu bạn muốn hàm
def add[x,y]:
return x + y
8 trả về một danh sách, bạn có thể truyền nó khi gọi hàmHãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó
lambda x, y: x + y
9Chức năng bộ lọc []
Tương tự như
def add[x,y]:
return x + y
8, def add[x,y]:
return x + y
9 lấy một đối tượng lambda x, y: x + y
2 và một iterable và tạo một danh sách mớiNhư tên gợi ý,
def add[x,y]:
return x + y
9 tạo thành một danh sách mới chỉ chứa các phần tử thỏa mãn một điều kiện nhất định, i. e. các lambda x, y: x + y
2 chúng tôi đã thông qua trả về lambda x, y: x + y
94Cú pháp là
lambda arguments: expression
6Sử dụng ví dụ trước, chúng ta có thể thấy rằng danh sách mới sẽ chỉ chứa các phần tử mà hàm
lambda x, y: x + y
60 trả về lambda x, y: x + y
94Chạy mã này sẽ dẫn đến một danh sách ngắn hơn
def add[x,y]:
return x + y
0Hoặc, viết lại bằng lambda
def add[x,y]:
return x + y
1In ấn cho chúng ta cùng một đầu ra
def add[x,y]:
return x + y
0Hàm giảm []
lambda x, y: x + y
0 hoạt động khác với def add[x,y]:
return x + y
8 và def add[x,y]:
return x + y
9. Nó không trả về một danh sách mới dựa trên lambda x, y: x + y
2 và có thể lặp lại mà chúng tôi đã thông qua. Thay vào đó, nó trả về một giá trị duy nhấtNgoài ra, trong Python 3,
lambda x, y: x + y
0 không còn là hàm tích hợp nữa và có thể tìm thấy hàm này trong mô-đun lambda x, y: x + y
62Cú pháp là
def add[x,y]:
return x + y
3lambda x, y: x + y
0 hoạt động bằng cách gọi lambda x, y: x + y
2 mà chúng tôi đã chuyển cho hai mục đầu tiên trong chuỗi. Kết quả trả về bởi lambda x, y: x + y
2 được sử dụng trong một lệnh gọi khác tới lambda x, y: x + y
2 cùng với phần tử tiếp theo [thứ ba trong trường hợp này],Quá trình này lặp lại cho đến khi chúng tôi đi qua tất cả các phần tử trong chuỗi
Đối số tùy chọn
lambda x, y: x + y
67 được sử dụng, khi có mặt, ở đầu "vòng lặp" này với phần tử đầu tiên trong lệnh gọi đầu tiên tới lambda x, y: x + y
2. Theo một cách nào đó, phần tử lambda x, y: x + y
67 là phần tử thứ 0, trước phần tử đầu tiên, khi được cung cấplambda x, y: x + y
0 khó hiểu hơn một chút so với def add[x,y]:
return x + y
8 và def add[x,y]:
return x + y
9, vì vậy hãy xem ví dụ từng bướcChúng tôi bắt đầu với một danh sách
73 và chuyển hàmlambda x, y: x + y
74 cholambda x, y: x + y
0 bên cạnh danh sách này, không có giá trịlambda x, y: x + y
67lambda x, y: x + y
0 cuộc gọilambda x, y: x + y
78 vàlambda x, y: x + y
79 trả vềlambda x, y: x + y
90lambda x, y: x + y
0 cuộc gọilambda x, y: x + y
92 [kết quả của cuộc gọi trước tớilambda x, y: x + y
79 và phần tử tiếp theo trong danh sách dưới dạng tham số] vàlambda x, y: x + y
79 trả vềlambda x, y: x + y
95lambda x, y: x + y
0 cuộc gọilambda x, y: x + y
97 vàlambda x, y: x + y
79 trả vềlambda x, y: x + y
99lambda x, y: x + y
Vì không còn phần tử nào trong chuỗi, nên
0 trả vềlambda x, y: x + y
99lambda x, y: x + y
Sự khác biệt duy nhất, nếu chúng tôi đã đưa ra một giá trị
lambda x, y: x + y
67 sẽ là một bước bổ sung - 1. 5. trong đó lambda x, y: x + y
0 sẽ gọi lambda arguments: expression
64 và sử dụng giá trị trả về đó trong bước 2Hãy tiếp tục và sử dụng hàm
lambda x, y: x + y
0def add[x,y]:
return x + y
4Chạy mã này sẽ mang lại
def add[x,y]:
return x + y
5Một lần nữa, điều này có thể được viết bằng lambdas
def add[x,y]:
return x + y
6Và mã sẽ dẫn đến
def add[x,y]:
return x + y
7Phần kết luận
Như đã đề cập trước đây, các chức năng này là chức năng tiện lợi. Chúng ở đó để bạn có thể tránh viết mã rườm rà hơn, nhưng tránh sử dụng quá nhiều cả chúng và biểu thức lambda
Đừng ép buộc những công cụ này bởi vì "bạn có thể", vì nó thường có thể dẫn đến mã không đọc được và khó bảo trì. Chỉ sử dụng chúng khi hoàn toàn rõ ràng điều gì đang xảy ra ngay khi bạn nhìn vào hàm hoặc biểu thức lambda
Nếu bạn thấy mình đang vật lộn để khớp logic cần thiết vào một hàm
def add[x,y]:
return x + y
8 hoặc một biểu thức lambda, thì tốt hơn hết là bạn chỉ nên viết một phương thức vòng lặp/xác định dài hơn một chút và tránh nhầm lẫn không cần thiết sau này