Chuyển đến nội dung chính
Mô-đun 5 · Bài học 4 trong tổng số 420/36 trong khóa học~10 min
Bài học theo mô-đun (4/4)

Lambda và các hàm bậc cao hơn

lambda là một hàm ẩn danh, được xác định trên một dòng. Cú pháp:

Python
lambda parametri: espressione

Tương đương với def, nhưng ngắn gọn hơn và phù hợp hơn cho việc "vứt đi" chức năng để chuyển sang các chức năng khác.

Python
quadrato = lambda x: x ** 2
quadrato(5)    # 25

# equivalent to:
def quadrato(x):
    return x ** 2

Sự khác biệt so với def

Khía cạnhdeflambda
tênbắt buộcẩn danh
cơ thểnhiều câu lệnhmột biểu thức ĐƠN
trở lạirõ ràngngầm định (biểu thức)
chuỗi tài liệuvângkhông

Không return bên trong lambda: giá trị của biểu thức LÀ kết quả.

Khi nào nên sử dụng lambda

Hầu như luôn luôn: dưới dạng đối số key cho các hàm sắp xếp hoặc lựa chọn.

Python
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']

key=len nói với sorted: "để so sánh hai phần tử, hãy sử dụng độ dài của chúng". cho tiêu chí tùy chỉnh, sử dụng lambda:

Python
utenti = [
    {"nome": "Ada", "eta": 36},
    {"nome": "Linus", "eta": 54},
    {"nome": "Grace", "eta": 85},
]
per_eta = sorted(utenti, key=lambda u: u["eta"])
# sorted by ascending age

Các cách sử dụng điển hình khác: min(...), max(...), filter(...), map(...).

Python
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n))   # -5 (maximum by absolute value)

Các hàm bậc cao hơn

Một hàm là bậc cao hơn nếu nó chấp nhận một hàm làm đối số hoặc trả lại một. sorted, max, filter, map là thứ tự cao hơn. Lambda tồn tại chính xác để thực hiện các cuộc gọi bậc cao dễ dàng hơn.

Khi nào nên tránh chức năng lambda

Hàm Lambda rất hữu ích cho các thao tác ngắn, dùng một lần (như sắp xếp nhanh). Tuy nhiên, nếu bạn thấy mình đang gán lambda cho một biến (ví dụ: double = lambda x: x * 2), thì thông thường nên sử dụng khối def tiêu chuẩn để dễ đọc và gỡ lỗi (vì các hàm được xác định bằng def giữ lại tên thật của chúng trong quá trình truy nguyên lỗi).

Hãy thử nó

tập thể dục#python.m5.l4.e1
Nỗ lực: 0Đang tải…

Cho danh sách `words = ['banana', 'kiwi', 'mela', 'fragola']`, sắp xếp nó theo độ dài tăng dần thành `by_length`. Đánh giá `by_length`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

key=len (hoặc lambda p: len(p)).

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#python.m5.l4.e2
Nỗ lực: 0Đang tải…

Đưa ra danh sách các bộ dữ liệu `points = [(1, 5), (3, 2), (2, 4)]`, sắp xếp chúng theo phần tử THỨ HAI theo thứ tự tăng dần và gán cho `by_y`. Đánh giá `by_y`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

lambda p: p[1]

Giải pháp khả dụng sau 3 lần thử

Thử thách bổ sung

tập thể dục#python.m5.l4.e3
Nỗ lực: 0Đang tải…

Define an anonymous `lambda` function that takes a number `x` and returns `True` if the number is even, and `False` otherwise. Assign the lambda to the variable `is_even` and test it with `is_even(8)` as the last line.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Viết is_even = lambda x: x % 2 == 0 rồi gọi is_even(8).

Giải pháp khả dụng sau 3 lần thử