Перейти к основному содержимому
Модуль 5 · Урок 4 из 420/36 в курсе~10 min
Уроки модуля (4/4)

Лямбда и функции высшего порядка

Лямбда — это анонимная функция, определенная в одной строке. Синтаксис:

Python
lambda parametri: espressione

Эквивалент def, но более краток и хорошо подходит для «одноразового использования». функции для передачи другим функциям.

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

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

Отличия от def

Аспектdeflambda
имятребуетсяанонимный
телонесколько заявленийОДИНОЧНОЕ выражение
вернутьявныйнеявное (выражение)
строка документацииданет

Нет return внутри лямбды: значение выражения ЯВЛЯЕТСЯ результатом.

Когда использовать лямбду

Почти всегда: как аргумент key для функций сортировки или выбора.

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

key=len сообщает sorted: «чтобы сравнить два элемента, используйте их длину». Для пользовательские критерии, используйте лямбда:

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

Другие типичные варианты использования: min(...), max(...), filter(...), map(...).

Python
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, сохраняют свои настоящие имена в обратных трассировках ошибок).

Попробуйте это

Упражнение#python.m5.l4.e1
Попыток: 0Загрузка…

Учитывая список `words = ['banana', 'kiwi', 'mela', 'fragola']`, отсортируйте его по возрастанию длины до `by_length`. Оцените `by_length`.

Загрузка редактора…
Показать подсказку

key=len (или лямбда p: len(p)).

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#python.m5.l4.e2
Попыток: 0Загрузка…

Учитывая список кортежей `points = [(1, 5), (3, 2), (2, 4)]`, отсортируйте их по ВТОРОМУ элементу в порядке возрастания и присвойте `by_y`. Оцените `by_y`.

Загрузка редактора…
Показать подсказку

лямбда р: р[1]

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#python.m5.l4.e3
Попыток: 0Загрузка…

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 попыток