Лямбда-выражения и анонимные функции в Python

В том руководстве вы узнаете о лямбда-выражениях Python и о том, как их использовать для создания анонимных функций.

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

Содержание

Что такое лямбда-выражения в Python?

Лямбда-выражения Python позволяют определять анонимные функции. Анонимные функции — это функции без имен. Анонимные функции полезны, когда вам нужно использовать их один раз.

Лямбда-выражение обычно содержит один или несколько аргументов, но может иметь только одно выражение.

Ниже показан синтаксис:

lambda parameters: expression

Это эквивалентно следующей функции без «анонимного» имени:

def anonymous(parameters):
    return expression

Примеры лямбда-выражений Python

В Python вы можете передать функцию другой функции или вернуть функцию из другой функции.

1) Функции, принимающие функции

Ниже определяется функция get_full_name(), которая форматирует полное имя из имени и фамилии:

def get_full_name(first_name, last_name, formatter):
    return formatter(first_name, last_name)

Функция get_full_name() принимает три аргумента:

  • Имя(first_name)
  • Фамилия(last_name)
  • Функция, которая форматирует полное имя(formatter). В свою очередь, функция форматирования принимает два аргумента: имя и фамилию.

Ниже определяются две функции, которые возвращают полное имя из имени и фамилии в разных форматах:

def first_last(first_name, last_name):
    return f"{first_name} {last_name}"


def last_first(first_name, last_name):
    return f"{last_name}, {first_name}"

Здесь показано, как вызвать функцию get_full_name(), передав имя, фамилию и функции first_last/last_first:

full_name = get_full_name('John', 'Doe', first_last)
print(full_name) # John Doe

full_name = get_full_name('John', 'Doe', last_first)
print(full_name) #  Doe, John

Выход:

John Doe
Doe, John

Вместо определения функций first_last и Last_first вы можете использовать лямбда-выражения.

Например, вы можете выразить функцию first_last, используя следующее лямбда-выражение:

lambda first_name,last_name: f"{first_name} {last_name}"

Это лямбда-выражение принимает два аргумента и объединяет их в форматированную строку в порядке first_name, пробел и last_name.

А следующий код преобразует функцию Last_first с использованием лямбда-выражения, которое возвращает полное имя в формате: фамилия, пробел и имя:

lambda first_name, last_name: f"{last_name} {first_name}";

Используя лямбда-выражения, вы можете вызвать функцию get_full_name() следующим образом:

def get_full_name(first_name, last_name, formatter):
    return formatter(first_name, last_name)


full_name = get_full_name(
    'John',
    'Doe',
    lambda first_name, last_name: f"{first_name} {last_name}"
)
print(full_name)

full_name = get_full_name(
    'John',
    'Doe',
    lambda first_name, last_name: f"{last_name} {first_name}"
)
print(full_name)

Выход:

John Doe
Doe, John

2) Функции, возвращающие функции

Следующая функция times() возвращает функцию, которая является лямбда-выражением:

def times(n):
    return lambda x: x * n

В этом примере показано, как вызвать функцию times():

double = times(2)

Поскольку функция times() возвращает функцию, двойное значение также является функцией. Чтобы вызвать его, вы ставите круглые скобки следующим образом:

result = double(2)
print(result)

result = double(3)
print(result)

Выход:

4
6

Ниже показан еще один пример использования функции times():

triple = times(3)

print(triple(2))  # 6
print(triple(3))  # 9

Лямбда в цикле Python

См. следующий пример:

callables = []
for i in(1, 2, 3):
    callables.append(lambda: i)

for f in callables:
    print(f())

Как это работает.

  • Сначала определите список с именем callables.
  • Во-вторых, выполните итерацию от 1 до 3, создайте новое лямбда-выражение на каждой итерации и добавьте его в список вызываемых объектов.
  • В-третьих, переберите вызываемые объекты и вызовите каждую функцию.

Ожидаемый результат будет:

1
2
3

Однако программа показывает следующий вывод:

3
3
3

Проблема в том, что все лямбда-выражения ссылаются на переменную i, а не на текущее значение i. Когда вы вызываете лямбда-выражения, значение переменной i равно 3.

Чтобы это исправить, вам нужно привязать переменную i к каждому лямбда-выражению во время создания лямбда-выражения. Один из способов сделать это — использовать аргумент по умолчанию:

callables = []
for i in(1, 2, 3):
    callables.append(lambda a=i: a)

for f in callables:
    print(f())

В этом примере значение a оценивается во время создания лямбда-выражения. Таким образом, программа возвращает ожидаемый результат.

Заключение

  • Используйте лямбда-выражения Python для создания анонимных функций, то есть функций без имен.
  • Лямбда-выражение принимает один или несколько аргументов, содержит выражение и возвращает результат этого выражения.
  • Используйте лямбда-выражения для передачи анонимных функций в функцию и возврата функции из другой функции.
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *