Lambda-функции в Python с их синтаксисом и примерами

1. Lambda-функции

В этом уроке мы изучим, что из себя представляют lambda-функции в Python с их синтаксисом и примерами. Кроме того, мы рассмотрим, как и когда следует объявлять lambda-функции, а также как их можно использовать вместе со встроенными функциями Python такими как reduce(), map() и filter()

Когда мы создаем функции в Python, мы всегда используем ключевое слово def. При этом, делая так, мы назначаем им определенное имя. Но иногда у нас может возникнуть потребность объявить функцию анонимно или мы можем захотеть использовать функцию только один раз. В таком случае определение функции может показаться лишним, и как раз здесь нам придут на помощь lambda-функции.


Lambda-функции в Python

2. Что собой представляет lambda-функция в Python?

Lambda-функция позволяет нам определять функцию анонимно. Стоит отметить, что она является именно функцией, а не оператором. То есть лямбда-функция возвращает значение, и у нее есть неявный оператор return. Ниже приведен синтаксис lambda-функций в Python. 

lambda [arg1, arg2, ..]: [выражение]

Lambda-функция, возвращает свое значение в том месте, в котором вы его объявляете.

Как объявить lambda-функцию?

Для того, чтобы объявить lambda-функцию, используйте ключевое слово lambda.

lambda e: e - 2

<function <lambda> at 0x03DBA978>

Вы можете назначить lambda-функцию переменной, если хотите использовать ее в дальнейшем.

downbytwo = lambda e:e-2

В этом примере e является аргументом, а e-2 выражением.

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

(lambda e:e-2)(1)

-1

4. Чем на самом деле является выражение lambda-функции в Python

Как мы смогли убедиться, lambda в Python возвращает выражение. Но у нас может появится вопрос, что же собой представляет выражение? В общем смысле, выражение — это последовательность букв символов и чисел, возвращающая определенное значение. Например, к выражениям можно отнести следующие записи.

  1. Арифметические операции, такие как a+b и a**b
  2. Вызовы функций, например sum(a,b) или print(«Hello»)

Но при этом, такие записи как назначение не могут быть определены как выражение для lambda-функции, так как они ничего не возвращают даже None.

5. Когда лучше использовать lambda-функцию в Python?

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

1. Когда у вас есть только одно выражение для исполнения в функции

Допустим, мы хотим для функции printhello() запрограммировать вывод на экран слова «Привет». Тогда в теле функции у нас будет всего одна строчка:

def printhello():
    print("Привет")
printhello()

Привет

Теперь давайте сделаем то же самое, используя lambda-функцию.

(lambda :print("Привет"))()

Привет

Заметьте, что здесь мы не использовали никаких аргументов. Но вернемся и более подробно рассмотрим мы этот момент в дальнейшем, а пока давайте обратимся к еще одному примеру.

z=lambda a=2:print("Hello")
z()

Привет

Здесь вы можете почитать больше о функциях на Python (англ.)

2. Когда нужно вызвать код только один раз

Одной из основных причин выделения функций из остального кода является необходимость в их многократном использовании. Но если вам нужно использовать какой-либо код не более чем один раз, вы можете прибегнуть к lambda-функциям, не объявляя для этого стандартную функцию.

6. Значения аргументов по умолчанию для lambda-функции в Python

В Python, как впрочем и в других языках, например, C++, мы можем задавать значения аргументов по умолчанию. Но как нам это может пригодиться? Допустим функция func1() принимает 2 параметра a и b. Что произойдет если пользователь программы передаст лишь один из этих параметров или даже ни одного? Как раз для того, чтобы избежать возможной ошибки, или облегчить работу пользователя, вы можете задать вашим параметрам значения по умолчанию.

Давайте рассмотрим пример.

def func1(a=2,b=3):
    print(a,' ',b)
func1()

2 3
func1(3)

3 3

Здесь значениями по умолчанию для a и b являются соответственно 2 и 3. Для того, чтобы задать значения по умолчанию для lambda-функции, запись будет следующей:

o = lambda x=1,y=2,z=3:x+y+z
o(2,3)

8
o(2)

7
o()

6

7. Синтаксис lambda-функции в Python

Мы уже посмотрели, как объявляетcя lambda-функция в Python, но, как и все, что состоит из частей, ее объявление предполагает различные варианты. Так давайте же посмотрим, что мы можем, а что не можем делать с lambda-функцией.

a. Аргументы в Python

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

a,b=1,2
y=lambda a,b:a+b
y()

Traceback (most recent call last):
File “<pyshell#167>”, line 1, in <module>
y()
TypeError: <lambda>() missing 2 required positional arguments: ‘a’ and ‘b’

Здесь отсутствуют значения и a и b

y=lambda a:a+b
y()

Traceback (most recent call last):
File “<pyshell#169>”, line 1, in <module>
y()
TypeError: <lambda>() missing 1 required positional argument: ‘a’

У переменной a все еще отсутствует значение

y=lambda :a+b
y()

3

Наконец здесь, так как нет аргументов с отсутствующим значением, все отлично работает. 

Рекомендуем ознакомиться со статьями Ошибки и Исключения в Python(англ.) и Как исправить ошибки в Python (англ.).

b. Пропускаем аргументы

Указывать аргументы в lambda-функции не обязательно. Она отлично работает и без них.

y=lambda :2+3
y()

5

Во втором примере давайте в качестве выражения используем функцию print()

(lambda :print("Привет"))()

Привет

Вывод напрашивается сам собой, — пропуск аргументов в lambda-функции является вполне приемлемым.

c. Пропускаем выражение

Теперь давайте попробуем запустить нашу функцию без выражения.

y=lambda a,b: 

SyntaxError: invalid syntax

Ясное дело ничего не сработало, да и почему оно должно было сработать, если значение выражение это как раз и есть то, что функция возвращает? Без выражения функция не имеет никакого смысла.

8. Совместное использование Lambda-функции со встроенными функциями Python

Существуют некоторые встроенные функции в Python, такие например как filter() или map(), в которых мы можем использовать lambda-функции, для выполнения определенных преобразований.  Давайте  же рассмотрим их поподробнее.

Для начала возьмем список под названием numbers

numbers=[0,1,2,3,4,5,6,7,8,9,10]

затем возьмем lambda-функцию следующего содержания.

lambda x:x%3==0

a. filter()

Функция filter() принимает два параметра — функцию и список для обработки. В нашем примере мы также применим функцию list(), чтобы преобразовать объект filter в список.

list(filter(lambda x:x%3==0,numbers))

[0, 3, 6, 9]

Вот окончательный код, который нам нужен, и можете сами попробовать догадаться, как он работает. Итак, он берет список numbers, и отфильтровывает все элементы из него, которые не делятся нацело на 3. При этом фильтрация никак не изменяет изначальный список.

Рекомендуем ознакомиться со статьей Списки в Python (англ)

b. map()

Функция map() в отличие от функции filter() возвращает значение выражения для каждого элемента в списке. Давайте посмотрим как это работает на уже знакомом нам списке numbers.

list(map(lambda x:x%3==0,numbers))

[True, False, False, True, False, False, True, False, False, True, False]

c. reduce()

Наконец функция reduce() принимает два параметра — функцию и список. Сперва она применяет стоящую первым аргументом функцию для двух начальных элементов списка, а затем использует в качестве аргументов этой функции полученное значение вместе со следующим элементом списка и так до тех пор, пока весь список не будет пройден, а итоговое значение не будет возвращено. Для того, чтобы использовать reduce(), вы должны сначала импортировать ее из модуля functools.

from functools import reduce
reduce(lambda x,y:y-x,numbers)

5

Давайте посмотрим как получился такой результат.

1-0=1
2-1=1
3-1=2
4-2=2
5-2=3
6-3=3
7-3=4
8-4=4
9-4=5
10-5=5

Таким образом, на выходе у нас получается 5.

Давайте теперь возьмем другой пример.

reduce(lambda x,y:y+x,numbers)

55

Если проделать то же самое для x+y, то у вас получится 55.

9. Заключение

На этом, пожалуй, все. В той статье мы с вами сперва изучили, чем является lambda-функция в Python, рассмотрели ее синтаксис, а также выяснили как ее создать. Далее мы рассмотрели, что из себя представляет выражение, а также как передать аргументы по умолчанию в выражение lambda. Наконец мы попробовали использовать lambda-функцию внутри трех встроенных функций filter(), map(), и reduce() и выяснили, что lambda в сравнении с обычными функциями имеет ряд преимуществ.

Если у вас появились какие-то вопросы, пожалуйста, оставляйте их в комментариях.