Анонимные lambda-функции

Мы разобрались, как писать функции с помощью def, однако это не всегда удобно.

Например, есть метод sort у списков, который сортирует список. У него есть аргумент key - это функция, которая применяется к каждому элементу и возвращает значение для сортировки.

Например, попробуем отсортировать список по модулю числа (модуль числа - это само число, если оно не меньше нуля, и ему противоположное, если меньше).

array = [1, -2, 9, 100, -4, 0, -14]

def modulo(number):
    return abs(number)

array.sort(key=modulo)
print(array)
# [0, 1, -2, -4, 9, -14, 100]

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

lambda-выражение позволяет не тратить несколько строк на запись функции, а записать её короче:

array = [1, -2, 9, 100, -4, 0, -14]
array.sort(key=lambda number: abs(number))
print(array)
# [0, 1, -2, -4, 9, -14, 100]

Здесь анонимная функция - это lambda number: abs(number), которая присвоена аргументу key метода sort.

В данном случае можно написать даже ещё короче (но не всегда функции будут настолько простыми):

array.sort(key=abs)

После инструкции lambda в анонимной функции идут аргументы (сколько угодно, или даже ни одного), затем двоеточие; а затем инструкция, как если бы мы в обычной функции (которая через def) сразу написали бы return (однако в lambda-функции инструкция return не нужна).

lambda-функцию можно присвоить переменной и затем использовать как обычную функцию:

modulo = lambda number: abs(number)

Однако на практике так, как правило, не делают.