Анонімні функції
Крім визначення функції за допомогою def
в Python є можливість використання анонімних (lambda) функцій.
Інструкція lambda повертає саму функцію, а не зв'язує її з певним іменем, як це відбувається при використанні def
. Тому такі функції називають анонімними.
Анонімні функції можуть містити лише один вираз. Синтаксис lambda-функцій виглядає так:
lambda argument1, argument2,... argumentN : <вираз з аргументами>
Розглянемо найпростіший приклад і порівняємо зі "звичайною" функцією Python:
>>> def func(x, y):
... return x + y
...
>>> func(5,7)
12
>>>
А тепер те ж саме, але за допомогою lambda
:
>>> func = lambda x, y: x + y
>>> func(5, 7)
12
>>> func('a', 'b')
'ab'
Анонімні функції не обов'язково присвоювати змінній.
>>> (lambda x, y: x + y)(5, 7)
12
>>> (lambda x, y: x + y)('a', 'b')
'ab'
lambda-функції, на відміну від звичайних, не потребують інструкції return, а в решті випадків поводить себе так само.
Наприклад, можна задати значення за замовчуванням для параметрів:
>>> hello = lambda name, time='morning': 'Good ' + time + ', ' + name
>>> hello('Jane')
'Good morning, Jane'
>>> hello('Jane', 'afternoon')
'Good afternoon, Jane'
>>>
Змінна кількість аргументів:
>>> func = lambda *args: args[1:-1]
>>> func(1,2,3,4,5)
(2, 3, 4)
>>>
Використовуємо if/else
:
>>> mymin = lambda x, y: x if x < y else y
>>> mymin(1,3)
1
>>> mymin(5,3)
3
>>>
Ну і переконаємось, що lambda-функції дійсно є анонімними, тобто об'єкт такої функції не має імені:
>>> f = lambda x: x
>>> f
<function <lambda> at 0x000001D894D9F0D0>
>>>
Використання lambda-функцій
lambda зручно використовувати коли треба передати функцію як аргумент іншій функції. Наприклад, маємо список письменників. Треба відсортувати список по прізвищам:
>>> authors = [
... "Edgar Allan Poe",
... "Arthur Conan Doyle",
... "Agatha Christie",
... "John Dickson Carr"
... ]
>>> authors = sorted(authors, key=lambda a: a.split()[-1])
>>> for author in authors:
... print(author)
...
John Dickson Carr
Agatha Christie
Arthur Conan Doyle
Edgar Allan Poe
>>>
Також lambda-функції часто використовуються при створенні так званих "таблиць переходів". Таблиці переходів — це, у більшості випадків, послідовності або словники, які містять дії. Приклад зі списком дій:
>>> functions = [
... lambda x: x**2,
... lambda x: x**3,
... lambda x: x**4,
... ]
>>> functions[1]
<function <lambda> at 0x000002B57FC0F268>
>>> for f in functions:
... print(f(3))
...
9
27
81
>>>
Анонімні функції як значення у словниках:
>>> d = {
... 'add': lambda x, y: x + y,
... 'mul': lambda x, y: x * y
... }
>>> d['add'](5, 5)
10
>>> d['mul'](5, 5)
25
>>>
Резюме
- lambda – це вираз, а не інструкція. Тому ключове слово lambda можна використовувати там, де синтаксис Python не дозволяє використовувати інструкцию
def
, наприклад у викликах функцій. - Тіло lambda – це не блок інструкцій, а один вираз. Тіло lambda-виразу схоже на те, що ви розміщуєте в інструкції
return
всередині визначенняdef
. - об'єкт lambda-функції не має імені