Функции
Лямбда-функции
Источники:
- Саммерфилд, Глава 4 Управляющие структуры и функции / Собственные функции / Лямбда-функции
Лямбда-функции - это функции, для создания которых используется следующий синтаксис:
lambda parametes: expression
parameters - не обязательная часть. Обычно позиционые переменные через запятую. Можно использовать полный синтаксис, который допустим в def.
expression :
- нельзя условные операторы или циклы (можно условные выражения);
- нельзя return или yield
Результатом лямбда-выражения является анонимная функция. При ее вызове вычисляется значение expression при указанных значениях параметров.
Если выражение expression - кортеж, то он должен быть заключен в круглые скобки ()
Пример: лямбда-функция, которая добавляет 's' если аргумент не 1 (окончание множественного числа).
s = lambda x: "" if x == 1 else "s" # Анонимная функция присваевается переменной s.
print("{0} file{1} processed".format(count, s(count)) # использование этой функции
Точно не нужно return?
Не нужно. Эти две функции area (площадь треугольника по основаниию b и высоте h) вызываются одинаково:
Обычная функция:
def area(b, h):
return 0.5 * b * h
Лямбда-функция (заметьте, return нет):
area = lambda b, h: 0.5 * b * h
Вызываем одинаково:
area(6, 5)
PEP-8 и лямбда-функции
Если код нужно использовать повторно (вызывать по имени), и функция пишется в одну строку, то лучше написать обычную функцию через def, а не использовать анонимную функцию (лямбду).
Плохо:
area = lambda b, h: 0.5 * b * h
Хорошо:
def area(b, h): return 0.5 * b * h
Пример лямбда-функции - сортировка по ключу
Пусть у нас есть список кортежей, которые описывают химические элементы (номер группы, порядковый номер, название).
>>> elements = [(2, 12, "Mg"), (1, 11, "Na"), (1, 3, "Li"), (2, 4, "Be")]
При сортировке по умолчанию получим:
>>> sorted(elements)
[(1, 3, 'Li'), (1, 11, 'Na'), (2, 4, 'Be'), (2, 12, 'Mg')]
Если мы не хотим учитывать при сортировке первый элемент кортежа (группу), то можно написать обычную функцию, которая вернет ключ. Но мы не хотим плодить много маленьких функций. Напишем лямбда-функцию при вызове sorted.
elements.sort(key=lambda e: (e[1], e[2])) # не забываем про () если возвращаем кортеж
elements.sort(key=lambda e: e[1:3]) # или так
Отсортируем сначала по названию (без учета регистра), а потом по порядковому номеру:
elements.sort(key=lambda e: (e[2].lower(), e[1]))
Пример лямбда-функции - словари со значением по умолчанию
При обращении к несуществующему ключу будет создано значение по умолчанию. Лямбда-функция задает это значение.
minus_one_dict = collections.defaultdict(lambda: -1)
point_zero_dict = collections.defaultdict(lambda: (0, 0))
message_dict = collections.defaultdict(lambda: "No message available")
assert
TODO