Функции

Лямбда-функции

Источники:

  • Саммерфилд, Глава 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

results matching ""

    No results matching ""