Анонимные 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)
Однако на практике так, как правило, не делают.