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:
lambda parametri: espressioneTươ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.
quadrato = lambda x: x ** 2
quadrato(5) # 25
# equivalent to:
def quadrato(x):
return x ** 2Sự khác biệt so với def
| Khía cạnh | def | lambda |
|---|---|---|
| tên | bắt buộc | ẩn danh |
| cơ thể | nhiều câu lệnh | một biểu thức ĐƠN |
| trở lại | rõ ràng | ngầm định (biểu thức) |
| chuỗi tài liệu | vâng | khô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.
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:
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 ageCác cách sử dụng điển hình khác: min(...), max(...), filter(...), map(...).
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ó
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`.
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
Đư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`.
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
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.
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ử