Перейти до змісту

Анонімні функції

Крім визначення функції за допомогою 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-функції не має імені
Back to top