Cú pháp của Python tương đối thuận tiện và dễ làm việc, nhưng ngoài cấu trúc cơ bản của ngôn ngữ, Python còn có các cấu trúc cú pháp nhỏ giúp một số tác vụ trở nên đặc biệt thuận tiện. Cấu trúc từ khóa/hàm lambda
là một trong số đó, nơi người sáng tạo gọi nó là "kẹo cú pháp". Ở đây chúng tôi sẽ kiểm tra làm thế nào để sử dụng chúng
Để hiểu từ khóa/hàm lambda
và cấu trúc của chúng, trước tiên chúng ta phải xem lại cách hoạt động của các định nghĩa hàm thông thường trong Python. Sau đây là cấu trúc cơ bản của một định nghĩa hàm
[python]
def cơ bản[arg].
# Hoặc bất kỳ hàm nào thực hiện
pass
# Hoặc bất kỳ hàm nào trả về
return
[/python]
Những gì chúng ta đã định nghĩa ở đây về cơ bản là một hàm trống có tên cơ bản, nhận một đối số, không làm gì cả [câu lệnh pass về cơ bản là một câu lệnh "không làm gì cả" hợp lệ], và sau đó trả về đối số mà nó đã đưa ra. Đây là cấu trúc cơ bản nhất của hầu hết các hàm, nhưng định nghĩa hàm đơn giản nhất sẽ chỉ bao gồm một trong các câu lệnh này - trong một câu lệnh, nó sẽ làm điều gì đó [hoặc vượt qua] hoặc trả về điều gì đó hoặc None
[câu lệnh return
luôn trả về ít nhất . Đây là cách hai trường hợp này sẽ trông như thế nào
[python]
def simple1[arg]. vượt qua
def simple2[arg]. trả về đối số
[/python]
Lưu ý cách chúng ta cũng đã lưu một dòng bằng cách đặt các câu lệnh thân hàm trên cùng một dòng với câu lệnh định nghĩa. Cấu trúc hàm lambda
chính xác là cấu trúc sau của hai cấu trúc này, tôi. e. một hàm một câu lệnh trả về một thứ gì đó, điểm khác biệt là từ khóa "return" được ngụ ý và không hiển thị trong cấu trúc. Bây giờ chúng ta đã biết cách thức hoạt động của hàm lambda
[giống hệt hàm một câu lệnh], hãy xây dựng hàm simple2 ở dạng lambda
. Để làm điều này, chúng tôi chỉ cần sử dụng cấu trúc lambda
- nếu chúng tôi gọi hàm lambda
của mình là đơn giản nhất, thì nó sẽ như vậy
[python]
simplest = lambda arg. arg
[/python]
Và đó là nó. Bây giờ chúng tôi có đơn giản nhất và đơn giản2 hoạt động theo cùng một cách chính xác, nhưng cái trước chúng tôi xây dựng với ít biệt ngữ hơn nhiều;
Nếu chúng ta xem xét chi tiết câu lệnh lambda
, chúng ta sẽ thấy rằng đó thực sự là một câu lệnh trả về một hàm [đó là lý do tại sao chúng ta gán nó cho một biến], và đây là sức mạnh thực sự của cấu trúc lambda
, vì vậy hãy xem xét
Giả sử chúng ta có một danh sách gồm 3 bộ trông như thế này
[python]
tups = [
[1, 3, -2],
[3,
[-1, 0, 4],
[0, -1, 3],
[-2, 6, -5]
]
[/python]
Nếu chúng tôi muốn một phiên bản tups được sắp xếp, chúng tôi chỉ cần cung cấp nó cho phương thức lambda
2 tích hợp
[python]
>>> đã sắp xếp[tups]
[[-2, 6, -5], [-1, 0,
[/python]
Điều này tốt nếu chúng ta chỉ muốn sắp xếp theo giá trị đầu tiên trong mỗi bộ, nhưng nếu chúng ta muốn sắp xếp theo giá trị thứ hai hoặc thứ ba thì sao? . Đây là cách nó sẽ tìm cách sắp xếp với giá trị thứ 2 trong mỗi bộ
[python]
>>> def sortkey[tup].
. return tup[1]
>>> đã sắp xếp[tups, key=sortkey]
[[0, -1, 3], [-1, 0,
[/python]
Điều này hoạt động hoàn hảo, nhưng chúng tôi đã sử dụng hết khoảng trống/dòng [nếu trong tệp tập lệnh] và bộ nhớ bổ sung cho hàm một câu lệnh chỉ giúp sắp xếp danh sách của chúng tôi. Nếu sử dụng một ngôn ngữ khác, chúng ta có thể không có lựa chọn nào khác ngoài việc làm điều này [hoặc tệ hơn], nhưng may mắn thay, chúng ta có cấu trúc hàm lambda
. -]. Với nó, chúng ta có thể định nghĩa hàm tương tự ở dạng đơn giản hơn
[python]
# Trả về hàm
>>> lambda tup. tup[1]
[/python]
Trong trường hợp đơn giản nhất, chúng tôi đã gán hàm lambda do cấu trúc/câu lệnh lambda
trả về một giá trị, nhưng sức mạnh của cấu trúc lambda là chúng ta không phải làm điều đó. Thay vào đó, chúng ta chỉ cần sử dụng trực tiếp câu lệnh trong lambda
2 cho khóa
[python]
>>> đã sắp xếp[tups, key=lambda tup. tup[1]]
[[0, -1, 3], [-1, 0, 4], [3, 2, 1], [1, 3, -2],
[/python]
Nó hoạt động tương tự như với lambda
8, nhưng bằng cách sử dụng biểu mẫu này, quy trình sẽ đơn giản hơn và tiết kiệm dòng và bộ nhớ
Đây là sức mạnh của các hàm lambda
và cấu trúc của chúng, nhưng phần tốt nhất là nó cũng sẽ hoạt động đối với bất kỳ phần nào trong tập lệnh của bạn cần một hàm như vậy. Điều đó bao gồm các chức năng sắp xếp/lặp lại được tích hợp sẵn [e. g. lambda
2, None
1 và None
2], các phương thức lớp như None
3 [với đối số None
4 là một hàm], các phương thức mẫu [như với None
5], các hàm gọi lại cho các tiện ích None
6, v.v. Vì vậy, đừng ngần ngại đặt các hàm lambda
hoạt động và khám phá tất cả những gì chúng có khả năng thực hiện