Лямбда-выражения и анонимные функции в Python
В том руководстве вы узнаете о лямбда-выражениях Python и о том, как их использовать для создания анонимных функций.
Иногда вам нужно написать простую функцию, содержащую одно выражение. Однако вам нужно использовать эту функцию один раз. И нет необходимости определять эту функцию с помощью ключевого слова def.
- Что такое лямбда-выражения в Python?
- Примеры лямбда-выражений Python
- 1) Функции, принимающие функции
- 2) Функции, возвращающие функции
- Лямбда в цикле Python
- Заключение
Что такое лямбда-выражения в 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 для создания анонимных функций, то есть функций без имен.
- Лямбда-выражение принимает один или несколько аргументов, содержит выражение и возвращает результат этого выражения.
- Используйте лямбда-выражения для передачи анонимных функций в функцию и возврата функции из другой функции.