Лямбда-функции в Python

Что такое лямбда-функции?


В Python функции являются объектами: они могут быть назначены переменным, могут быть возвращены из других функций, сохранены в списках или словарях и переданы в качестве параметров для других функций. Рассмотрим, например, map() встроенная функция. Его синтаксис map(function, iterable) и используется для удобного применения function к каждому элементу iterable.

map() фактически возвращает iterator объект. На практике мы преобразовываем результат в list, tuple, set, dictи т.д., как удобнее.

Предположим, вы хотите возвести в квадрат каждый член списка, используя map() функция. Для этого определим square() функцию и использовать ее как параметр для map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]


Однако, если единственное использование нашего square() функция состоит в том, чтобы создать этот список, чище использовать lambda функция:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

В Python lambda функции — это анонимные функции, которые получили свое имя и синтаксис от Алонзо Чёрча. Лямбда-исчисление. Их синтаксис:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

Это создает анонимную функцию, которая получает на вход переменные x_1, ..., x_n и возвращает оцененное expression(x_1, ..., x_n).

Цель lambda функции должны использоваться в качестве параметра для функций, которые принимают функции в качестве параметра, как мы сделали с map() выше. Python позволяет назначить lambda функцию переменной, но Руководство по стилю PEP 8 советует против этого. Если вы хотите присвоить переменной простую функцию, лучше сделать это в виде однострочного определения. Это гарантирует правильное имя результирующего объекта, улучшая читаемость трассировки:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

Зачем использовать лямбда-функции?

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

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

x = 2

Переменная x является заполнителем (или именем) для целого числа 2. Например, вызов print(x) и print(2) дает точно такой же результат. В случае функций:

def square(x): return x**2

Функция square() является заполнителем для вычисления возведения числа в квадрат. Это вычисление можно записать безымянным образом как lambda x: x**2.

После этого философского отступления рассмотрим несколько примеров применения lambda функции.

Использование Lambda с функцией sorted()

Ассоциация sorted() функция сортирует итерируемый объект. Он принимает функцию как свою key аргумент, а результат функции, применяемой к каждому элементу итерации, используется для упорядочения элементов.

Это идеально подходит для lambda Функция: установив key параметр с lambda функцию, мы можем сортировать по любому атрибуту элементов. Например, мы можем отсортировать список имен по фамилии:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

Использование Lambda с функцией filter()

Ассоциация filter() функция имеет следующий синтаксис: filter(function, iterable) и выводит элементы iterable которые оценивают function(element) как истина (это похоже на WHERE предложение в SQL). Мы можем использовать lambda функции в качестве параметров для filter() для выбора элементов из итерации.

Рассмотрим следующий пример:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() применяет lambda функция lambda x: (x % 3 == 0) and (x % 5 == 0) к каждому элементу range(0,100)и возвращает filter объект. Мы получаем доступ к элементам, приведя их как list.

Использование Lambda с функцией map()


Наш последний пример — это то, что мы видели во введении — map() функция. map() синтаксис функции: map(function, iterable)и map() применяется function к каждому элементу iterable, возвращая map объект, к которому можно получить доступ, приведя к list.

Мы видели, как это можно применить к спискам, но это можно применить и к словарям, используя dict.items() Метод:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

или в строку:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

Мы можем использовать map() гениальными способами — один из примеров — применение множества функций к одному и тому же входу.

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

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

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

Заключение


В этом руководстве мы рассмотрели функциональные возможности lambda функции в Python. Мы видели это lambda функции — это анонимные функции, которые можно использовать в качестве встроенного параметра функции для других функций. Мы видели некоторые варианты использования, а также случаи, когда их не следует использовать.

При программировании важно помнить цитату Дональда Кнута: «Программы предназначены для чтения людьми и только случайно для выполнения компьютерами». Имея это в виду, lambda функции — полезный инструмент для упрощения нашего кода, но им следует пользоваться с умом.

Отметка времени:

Больше от Стекабьюс