Tin tức và phân tích của tất cả các thiết bị di động

Cách sử dụng hàm lambda trong python [With Examples]

Trong hướng dẫn này, bạn sẽ tìm hiểu mọi thứ về hàm lambda trong Python, từ cú pháp để xác định hàm lambda đến các trường hợp sử dụng khác nhau với các ví dụ về mã.

Trong Python, lambdas là các hàm ẩn danh có cú pháp ngắn gọn và có thể được sử dụng với các hàm tích hợp hữu ích khác. Đến cuối hướng dẫn này, bạn sẽ tìm hiểu cách xác định các hàm lambda và khi nào bạn nên cân nhắc sử dụng chúng thay vì các hàm Python thông thường.

Hãy bắt đầu!

Hàm lambda Python: cú pháp và ví dụ

Đây là cú pháp chung để xác định các hàm lambda trong Python:

lambda parameter(s):return value

Trong cú pháp chung ở trên:

  • lambda là một từ khóa nên được sử dụng để xác định hàm lambda, theo sau là một hoặc nhiều tham số mà hàm sẽ nhận.
  • Các tham số và giá trị trả về được phân tách bằng dấu hai chấm.

💡 Khi xác định hàm lambda, hãy đảm bảo rằng giá trị trả về được tính toán bằng cách đánh giá một biểu thức liên quan đến một dòng mã. Bạn sẽ hiểu điều này tốt hơn khi chúng tôi viết mã ví dụ.

Ví dụ về hàm lambda trong Python

Cách tốt nhất để hiểu các hàm lambda là viết lại các hàm python bình thường thành các hàm lambda.

👩🏽‍💻 Bạn có thể viết mã bằng Python REPL hoặc trong trình soạn thảo Python trực tuyến newsblog.pl.

#1. Xét hàm square() sau, hàm này nhận một số làm đối số và trả về bình phương của số đó.

def square(num):
    return num*num

Bạn có thể gọi hàm với các đối số và xem nó có hoạt động chính xác không.

>>> square(9)
81
>>> square(12)
144

Bạn có thể gán biểu thức lambda này cho một tên biến, chẳng hạn như square1 để làm cho định nghĩa hàm ngắn gọn hơn: square1 = lambda number: number*number, sau đó gọi square1 với bất kỳ số nào làm đối số. Tuy nhiên, chúng ta biết rằng lambda là các hàm ẩn danh, vì vậy chúng ta nên tránh gán chúng cho một biến.

Đối với square(), tham số là num và giá trị trả về là num*num. Khi chúng tôi đã xác định chúng, chúng tôi có thể cắm chúng vào biểu thức lambda và gọi chúng bằng một đối số, như được hiển thị:

>>> (lambda num: num*num)(2)
4

Đây là khái niệm về biểu thức hàm ngay lập tức trong đó chúng ta gọi hàm ngay khi nó được xác định.

#2. Tiếp theo, hãy viết lại một hàm add() đơn giản khác lấy các số, num1 và num2, rồi trả về tổng của chúng, num1 + num2.

def add(num1,num2):
    return num1 + num2

Hãy gọi hàm add() với hai số làm đối số:

>>> add(4,3)
7
>>> add(12,5)
17
>>> add(12,6)
18

Trong trường hợp này, num1 và num2 là hai tham số và giá trị trả về là num1 + num2.

>>> (lambda num1, num2: num1 + num2)(3,7)
10

Các hàm Python cũng có thể lấy các giá trị tham số mặc định. Hãy sửa đổi định nghĩa của hàm add() và đặt giá trị mặc định của tham số num2 thành 10.

def add(num1, num2=10):
    return num1 + num2

Trong các lệnh gọi hàm sau:

  • Trong lần gọi hàm đầu tiên, giá trị của num1 là 1và giá trị của num2 là 3. Khi bạn chuyển num2 trong một lệnh gọi hàm, giá trị đó sẽ được sử dụng; hàm trả về 4.
  • Tuy nhiên, nếu bạn chỉ truyền một đối số (num1 là 7), giá trị mặc định là 10 được sử dụng cho num2; hàm trả về 17.
>>> add(1,3)
4
>>> add(7)
17

Khi viết các hàm lấy giá trị mặc định cho một số tham số làm biểu thức lambda, bạn có thể chỉ định một giá trị mặc định khi xác định tham số.

>>> (lambda num1, num2 = 10: num1 + num2)(1)
11

Khi nào bạn nên sử dụng các hàm lambda trong Python?

Bây giờ bạn đã biết kiến ​​thức cơ bản về hàm lambda trong Python, sau đây là một số trường hợp sử dụng:

  • Nếu bạn có một hàm có biểu thức trả về là một dòng mã và bạn không cần tham chiếu hàm đó ở nơi khác trong cùng một mô-đun, thì bạn có thể sử dụng hàm lambda. Để hiểu điều này, chúng tôi cũng đã mã hóa một số ví dụ.
  • Bạn có thể sử dụng các hàm lambda khi sử dụng các hàm tích hợp sẵn như map(), filter() và Reduce().
  • Các hàm lambda có thể hữu ích trong việc sắp xếp các cấu trúc dữ liệu Python chẳng hạn như danh sách và từ điển.

Cách sử dụng Python Lambda với các hàm tích hợp

1. Sử dụng Lambda với bản đồ()

Hàm map() nhận một iterable và một hàm và áp dụng nó cho từng phần tử trong iterable như minh họa:

Hãy tạo một danh sách các số và sử dụng hàm map() để tạo một danh sách mới chứa bình phương của mỗi số trong danh sách số. Lưu ý việc sử dụng hàm lambda để xác định thao tác bình phương.

>>> nums = [4,5,6,9]
>>> list(map(lambda num:num*num,nums))
[16, 25, 36, 81]

Vì map() trả về một đối tượng bản đồ, nên chúng ta nên truyền nó vào một danh sách.

▶️ Xem hướng dẫn map() bằng Python.

2. Sử dụng Lambda với bộ lọc()

Hãy xác định các số, một danh sách các số:

>>> nums = [4,5,6,9]

Giả sử bạn muốn lọc danh sách này và chỉ giữ lại các số lẻ.

Bạn có thể sử dụng hàm filter() tích hợp sẵn của Python.

Hàm filter() nhận một điều kiện và một lần lặp: filter(condition, iterable). Kết quả chỉ chứa các phần tử của phép lặp ban đầu thỏa mãn điều kiện. Bạn có thể truyền đối tượng được trả về thành một python có thể lặp lại như một danh sách.

Để lọc ra tất cả các số chẵn, chúng tôi sẽ chỉ giữ lại các số lẻ. Vì vậy, biểu thức lambda phải là lambda num: num%2!=0. số %2 là phần còn lại của phép chia num cho 2.

  • số%2!=0 đúng khi số lẻ và
  • con số%2!=0 là sai khi số chẵn.
>>> nums = [4,5,6,9]
>>> list(filter(lambda num:num%2!=0,nums))
[5, 9]

3. Sử dụng Lambda với Giảm()

Reduce() nhận một phép lặp và một hàm. Giảm lặp lại bằng cách áp dụng các chức năng lặp đi lặp lại trên các phần tử có thể lặp lại.

Để sử dụng Giảm(), bạn cần nhập nó từ mô-đun funcools tích hợp sẵn của python:

>>> from functools import reduce

Hãy sử dụng hàm Giảm () để tính tổng của tất cả các số trong danh sách nums. Chúng tôi xác định một biểu thức lambda: lambda num1,num2:num1+num2, là một hàm của tổng giảm.

Thao tác rút gọn sẽ như sau: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24. Ở đây f là phép tính tổng trên hai mục danh sách, được xác định bởi hàm lambda.

>>> from functools import reduce
>>> nums = [4,5,6,9]
>>> reduce(lambda num1,num2:num1+num2,nums)
24

Hàm lambda Python để sắp xếp tùy chỉnh

Ngoài việc sử dụng các hàm lambda với các hàm tích hợp sẵn của Python như map(), filter() và Reduce(), bạn cũng có thể sử dụng chúng để tùy chỉnh các hàm và phương thức tích hợp sẵn dùng để sắp xếp.

1. Sắp xếp danh sách python

Khi làm việc với các danh sách trong Python, bạn sẽ thường xuyên cần sắp xếp chúng dựa trên các tiêu chí sắp xếp nhất định. Để sắp xếp các danh sách Python tại chỗ, bạn có thể sử dụng phương thức sort() tích hợp sẵn trên chúng. Nếu bạn cần một bản sao đã sắp xếp của danh sách, bạn có thể sử dụng hàm sorted().

Cú pháp để sử dụng hàm sorted() của Python là sort(có thể lặp lại, key=…,reverse=True | False).

– Tham số key được sử dụng để tùy chỉnh việc sắp xếp.
– Tham số đảo ngược có thể được đặt thành Đúng hoặc Sai; Mặc định này sai.

Khi sắp xếp danh sách các số và chuỗi, sắp xếp mặc định theo thứ tự tăng dần và thứ tự bảng chữ cái tương ứng. Tuy nhiên, đôi khi bạn có thể muốn xác định tiêu chí sắp xếp tùy chỉnh.

Hãy xem xét danh sách trái cây dưới đây. Giả sử bạn muốn lấy một bản sao đã được sắp xếp của một danh sách. Sắp xếp các chuỗi theo số lần xuất hiện của “p” trong chúng, theo thứ tự giảm dần.

>>> fruits = ['apple','pineapple','grapes','mango']

Đã đến lúc sử dụng tham số khóa tùy chọn. Một chuỗi có thể lặp lại trong Python và để lấy số lần xuất hiện của một ký tự trong đó, bạn có thể sử dụng phương thức .count() tích hợp sẵn. Vì vậy, chúng tôi đặt khóa thành lambda x:x.count(‘p’) để sắp xếp dựa trên số lần xuất hiện của ‘p’ trong chuỗi.

>>> fruits = ['apple','pineapple','grapes','mango']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['pineapple', 'apple', 'grapes', 'mango']

Trong ví dụ này:

  • Chìa khóa để sắp xếp là số lần xuất hiện của “p”, được định nghĩa là biểu thức lambda.
  • Vì chúng tôi đã đặt tham số ngược lại thành True, nên sắp xếp theo thứ tự giảm dần của số lần xuất hiện của “p”.

Trong danh sách các loại trái cây, từ “dứa” chứa 3 lần xuất hiện của “p” và các chuỗi “apple”, “grapes” và “mango” lần lượt chứa 2, 1 và 0 lần xuất hiện “p”.

Hiểu sắp xếp ổn định

Hãy xem xét một ví dụ khác. Đối với tiêu chí sắp xếp tương tự, chúng tôi đã xác định lại danh sách trái cây. Ở đây, “p” lần lượt xuất hiện trong chuỗi “apple” và “grape” một lần và hai lần. Và nó không bao giờ được tìm thấy trong chuỗi “xoài” và “dưa”.

>>> fruits = ['mango','apple','melon','grapes']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['apple', 'grapes', 'mango', 'melon']

Trong danh sách đầu ra, “xoài” đứng trước “dưa”, mặc dù cả hai đều thiếu chữ “p”. Nhưng tại sao lại như vậy? Hàm sorted() thực hiện sắp xếp ổn định; vì vậy khi số ‘p’ bằng nhau cho hai chuỗi, thứ tự của các phần tử trong danh sách trái cây ban đầu được giữ nguyên.

Như một bài tập nhanh, hoán đổi vị trí của “xoài” và “dưa” trong danh sách trái cây, sắp xếp danh sách theo cùng một tiêu chí và quan sát kết quả.

▶️ Tìm hiểu thêm về cách sắp xếp danh sách python.

2. Sắp xếp từ điển Python

Bạn cũng có thể sử dụng lambdas khi sắp xếp từ điển Python. Hãy xem xét price_dict sau chứa các mặt hàng và giá của chúng.

>>> price_dict = {
... 'Milk':10,
... 'Honey':15,
... 'Bread':7,
... 'Candy':3
... }

Để lấy các cặp khóa-giá trị từ điển dưới dạng danh sách các bộ dữ liệu, bạn có thể sử dụng phương thức từ điển tích hợp sẵn .items():

>>> price_dict_items = price_dict.items()
dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])

Trong Python, tất cả các lần lặp: danh sách, bộ dữ liệu, chuỗi, v.v., đều tương thích với chỉ mục null. Vì vậy, mục đầu tiên nằm dưới chỉ mục 0thứ hai dưới chỉ mục 1 và như thế.

Chúng tôi muốn sắp xếp theo giá trị, đó là giá của từng mục trong từ điển. Trong mỗi bộ trong danh sách price_dict_items, một mục có chỉ mục 1 là giá cả. Vì vậy, chúng tôi đặt khóa thành lambda x:x[1] bởi vì nó sẽ sử dụng mục tại chỉ mục 1giá để sắp xếp từ điển.

>>> dict(sorted(price_dict_items,key=lambda x:x[1]))
{'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}

Ở đầu ra, các mục từ điển được sắp xếp theo thứ tự tăng dần theo giá: bắt đầu bằng “Kẹo”, theo giá 3 đơn vị, thành “Mật ong”, với giá 15 đơn vị.

▶️ Để tìm hiểu thêm, hãy xem hướng dẫn chi tiết này về cách sắp xếp từ điển Python theo khóa và giá trị.

Tóm lại

Và bạn đã có nó! Bạn đã học cách xác định các hàm lambda và sử dụng chúng một cách hiệu quả với các hàm Python tích hợp sẵn khác. Dưới đây là tóm tắt những phát hiện quan trọng nhất:

  • Trong Python, lambdas là các hàm ẩn danh có thể nhận nhiều đối số và trả về một giá trị; biểu thức được đánh giá để tạo giá trị trả về này phải là một dòng mã. Chúng có thể được sử dụng để xác định chính xác các chức năng nhỏ.
  • Để xác định hàm Lambda, bạn có thể sử dụng cú pháp: (các) tham số lambda: giá trị trả về.
  • Một số trường hợp sử dụng quan trọng bao gồm sử dụng chúng với các hàm map(), filter() và Reduce() và làm tham số chính để tùy chỉnh sắp xếp lặp lại của Python.

Sau đó, tìm hiểu cách chia tầng trong Python.