Что такое лямбда-функции?
В 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**2
def named_square(x): return x**2
print(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
функции — полезный инструмент для упрощения нашего кода, но им следует пользоваться с умом.