Модульні уроки (4/4)
Лямбда-функції та функції вищого порядку
лямбда — це анонімна функція, визначена в одному рядку. Синтаксис:
lambda parametri: espressioneЕквівалент def, але більш стислий і добре підходить для "викидання"
функції для переходу до інших функцій.
quadrato = lambda x: x ** 2
quadrato(5) # 25
# equivalent to:
def quadrato(x):
return x ** 2Відмінності проти def
| Аспект | def | lambda |
|---|---|---|
| назва | необхідний | анонімний |
| тіло | кілька заяв | ОДИН вираз |
| повернення | явний | неявний (вираз) |
| рядок документації | так | ні |
Ні return всередині лямбда: значення виразу Є результатом.
Коли використовувати лямбда
Майже завжди: як аргумент key для функцій сортування або вибору.
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']key=len повідомляє sorted: «щоб порівняти два елементи, використовуйте їх довжину». для
спеціальні критерії, використовуйте лямбда:
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Інші типові використання: min(...), max(...), filter(...), map(...).
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n)) # -5 (maximum by absolute value)Функції вищого порядку
Функція є вищого порядку, якщо вона приймає функцію як аргумент або
повертає один. sorted, max, filter, map мають вищий порядок. Лямбда
існує саме для того, щоб полегшити виклики вищого порядку.
Коли слід уникати лямбда-функцій
Лямбда-функції корисні для коротких одноразових операцій (наприклад, швидкого сортування). Однак, якщо ви виявите, що призначаєте лямбда-вираз до змінної (наприклад, double = lambda x: x * 2), зазвичай краще використовувати стандартний блок def для зручності читання та налагодження (оскільки функції, визначені за допомогою def, зберігають свої справжні назви під час відстеження помилок).
Спробуйте
Дано список `words = ['banana', 'kiwi', 'mela', 'fragola']`, відсортуйте його за зростанням довжини в `by_length`. Оцініть `за_довжиною`.
Показати підказку
key=len (або лямбда p: len(p)).
Рішення доступне після 3 спроб
Повторна вправа
Маючи список кортежів `points = [(1, 5), (3, 2), (2, 4)]`, відсортуйте їх за ДРУГИМ елементом у порядку зростання та призначте `by_y`. Оцініть `by_y`.
Показати підказку
лямбда p: p[1]
Рішення доступне після 3 спроб
Додатковий виклик
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.
Показати підказку
Напишіть is_even = лямбда x: x % 2 == 0, а потім викличте is_even(8).
Рішення доступне після 3 спроб