Các hàm Lambda trong Python

Hàm Lambda là gì?

â € <
Trong Python, hàm là đối tượng: chúng có thể được gán cho các biến, có thể được trả về từ các hàm khác, được lưu trữ trong danh sách hoặc lệnh và được truyền dưới dạng tham số cho các hàm khác. Hãy xem xét, ví dụ, map() chức năng tích hợp. Cú pháp của nó là map(function, iterable) và nó được sử dụng để áp dụng một cách thủ công function đến mọi phần tử của iterable.

map() thực sự trả lại một iterator sự vật. Trong thực tế, chúng tôi đưa ra kết quả dưới dạng list, tuple, set, dict, v.v., tùy theo cách nào thuận tiện hơn.
â € <
Giả sử bạn muốn bình phương mọi số hạng của danh sách bằng cách sử dụng map() chức năng. Để làm được điều đó, chúng ta sẽ xác định một square() chức năng và sử dụng nó làm tham số cho map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

â € <
Tuy nhiên, nếu việc sử dụng duy nhất của chúng tôi square() Chức năng của nó là tạo danh sách này, sẽ sạch hơn nếu sử dụng một lambda chức năng:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

Trong Python, lambda hàm là các hàm ẩn danh lấy tên và cú pháp từ Alonzo Church's Giải tích Lambda. Cú pháp của họ là:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

Điều này tạo ra một hàm ẩn danh nhận các biến đầu vào x_1, ..., x_n và trả về đánh giá expression(x_1, ..., x_n).
â € <
Mục đích của lambda các hàm sẽ được sử dụng làm tham số cho các hàm chấp nhận hàm làm tham số, như chúng ta đã làm với map() bên trên. Python cho phép bạn gán một lambda hoạt động với một biến, nhưng Hướng dẫn kiểu PEP 8 khuyên chống lại nó. Nếu bạn muốn gán một hàm đơn giản cho một biến, tốt hơn nên thực hiện dưới dạng định nghĩa một dòng. Điều này đảm bảo đối tượng kết quả được đặt tên chính xác, cải thiện khả năng đọc theo dõi:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

Tại sao nên sử dụng hàm Lambda?

Sau đoạn cuối cùng, bạn có thể tự hỏi tại sao bạn lại muốn sử dụng một lambda chức năng. Rốt cuộc, bất cứ điều gì có thể được thực hiện với một lambda chức năng có thể được thực hiện với một chức năng được đặt tên.
â € <
Câu trả lời cho điều này là lambda chức năng mục đích là sống bên trong các biểu thức lớn hơn biểu diễn một phép tính. Một cách để suy nghĩ về điều này là bằng cách tương tự với các biến và giá trị. Hãy xem xét đoạn mã sau:

x = 2

Biến x là phần giữ chỗ (hoặc tên) cho số nguyên 2. Chẳng hạn, việc gọi print(x)print(2) cho kết quả chính xác như nhau. Trong trường hợp hàm:

def square(x): return x**2

Các chức năng square() là một phần giữ chỗ để tính bình phương một số. Tính toán này có thể được viết theo cách không tên là lambda x: x**2.
â € <
Theo sự lạc đề triết học này, chúng ta hãy xem một số ví dụ về ứng dụng của lambda chức năng.
â € <

Sử dụng Lambda với hàm được sắp xếp ()

Sản phẩm sorted() hàm sắp xếp một lần lặp. Nó chấp nhận một chức năng như key đối số và kết quả của hàm áp dụng cho từng phần tử của iterable được sử dụng để sắp xếp các phần tử.
â € <
Điều này hoàn toàn phù hợp với một lambda chức năng: bằng cách thiết lập key tham số với một lambda hàm, chúng ta có thể sắp xếp theo bất kỳ loại thuộc tính nào của các phần tử. Ví dụ: chúng ta có thể sắp xếp danh sách tên theo họ:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

Sử dụng Lambda với chức năng 'filter()'

Sản phẩm filter() hàm có cú pháp sau: filter(function, iterable) và nó xuất ra các phần tử của iterable đánh giá nào function(element) là đúng (nó tương tự như một WHERE mệnh đề trong SQL). Chúng ta có thể sử dụng lambda đóng vai trò là tham số cho filter() để chọn các phần tử từ một iterable.

Hãy xem xét ví dụ sau:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() áp dụng lambda chức năng lambda x: (x % 3 == 0) and (x % 5 == 0) cho mỗi phần tử của range(0,100)và trả về một filter sự vật. Chúng tôi truy cập các phần tử bằng cách chuyển nó thành list.
â € <

Sử dụng Lambda với hàm map()

â € <
Ví dụ cuối cùng của chúng tôi là điều chúng tôi đã thấy trong phần giới thiệu – ví dụ map() chức năng. Các map() cú pháp hàm là: map(function, iterable)map() áp dụng function cho mỗi phần tử của iterable, trả lại một map đối tượng có thể được truy cập bằng cách truyền tới một list.

Chúng ta đã thấy cách áp dụng điều này cho danh sách, nhưng nó cũng có thể được áp dụng cho các mệnh lệnh bằng cách sử dụng dict.items() phương pháp:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

hoặc tới một chuỗi:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

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, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Chúng ta có thể sử dụng map() hoạt động theo những cách khéo léo – một ví dụ là áp dụng nhiều chức năng cho cùng một đầu vào.

Ví dụ: giả sử bạn đang tạo một API nhận chuỗi văn bản và bạn muốn áp dụng danh sách các hàm cho chuỗi đó.

Mỗi chức năng trích xuất một số tính năng từ văn bản. Đặc điểm chúng ta muốn trích xuất là số từ, từ thứ hai và chữ cái thứ tư của từ thứ tư:

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

â € <

Kết luận

â € <
Trong hướng dẫn này, chúng tôi đã khám phá chức năng của lambda các hàm trong Python. Chúng tôi đã thấy điều đó lambda hàm là các hàm ẩn danh được sử dụng làm tham số hàm nội tuyến cho các hàm khác. Chúng tôi đã thấy một số trường hợp sử dụng cũng như khi không sử dụng chúng.
â € <
Khi lập trình, điều quan trọng là phải ghi nhớ câu nói của Donald Knuth: “Các chương trình được tạo ra để được con người đọc và chỉ ngẫu nhiên để máy tính thực thi”. Với ý nghĩ này, lambda Hàm là một công cụ hữu ích để đơn giản hóa mã của chúng ta nhưng nên được sử dụng một cách khôn ngoan.

Dấu thời gian:

Thêm từ xếp chồng lên nhau