В основном питоне это не Функциональный язык программирования,
в питоне есть lambda функции, но используются они не часто, и
если используются то для решения простейших задач.
Обычные функции именованы, lambda это тоже функция, но не
именованная, так что при получении ошибки мы не увидим ее имени.
Основные инструменты функционального в питоне:
lambdamapfilterzip
filter - специальная функция, что как и map применяет
функцию к некоторой последовательности, но если map применяла
функцию к каждому элементу и возвращала все элементы
последовательности, то функция filter не меняет элементы
последовательности, но использует полученную функцию для
сортировки элементов.
Как и map функция filter возвращает особый обьект который
требуется явно привести к структуре.
Функция на основе которой будет происходить фильтрация должна
возвращать True / False таким образом эта функция будет
применена к каждому элементу последовательности, и в
отфильтрованные попадут только те значения для которых
было возвращено True
Пример №1
Создадим фильтр, который будет фильтровать список на положительные значения.
def filter_plus(number):
if number > 0:
return True
return False
some_list = [-10, -7, -5, 0, 1, 4, 5, 7, 12]
result = list(filter(filter_plus, some_list))
print(result)
# Вывод
# [1, 4, 5, 7, 12]Это анонимная функция, по сути представляет собой выражение,
используется для удобной замены меленький стандартных функций,
lambda автоматически применяет оператор return к результату
вычисления.
Лямбда принимает любое количество аргументов (или ни одного), но состоит из одного выражения.
lambda arguments: expression
Иметь lambda функции из нескольких строк кода нельзя,
только одно выражение.
Стандартная запись функций, требует создание функции и ее использование, к примеру след образом.
def make_sum(x, y):
return x + y
print(make_sum(1, 2))
# Вывод
# 3Замена предыдущей функции на lambda функцию:
make_sum = lambda x, y: x + y
result = make_sum(1, 5)
print(result)
# Вывод
# 6Таким образом мы создали функцию в переменной, и используем ее как
функцию, однако PEP - рекомендации по работе с кодом питона, не
советует использование lambda функций как полноценную замену
настоящим функциям.
lambda функции обычно используются для замены некого одноразового
действия с какой-либо структурой данных, примеру пройтись по всем
элементам списка, и сделать некое простейшие действие.
Проблема может заключаться в том что если мы постоянно используем
lambda выражения и где-то в них произойдет ошибка, то поймать
ее будет проблематично, lambda функция не имеет имени, так что вы
не увидите в отладке название функции в которой произошла ошибка.
Пример №1
Простейшее использование, передаем в lambda 2 переменные,
складываем и возвращаем результат:
some_lambda = lambda x, y: x + y
print(some_lambda(10, 70))
# Вывод
# 80Пример №2
Мы можем устанавливать значения по умолчанию, это полезно когда мы создаем функцию которая по умолчанию удваивает значение, но при необходимости можем передать второй аргумент.
some_lambda = lambda x, y=2: print(x*y)
some_lambda(10)
some_lambda = lambda x, y=2: print(x*y)
some_lambda(10, 5)
# Вывод
# 20
# 50Пример №3
Можно скомбинировать, labmda и map функции, map принимает
2 параметра, функцию которую требуется применить на некоторую
последовательность, и саму последовательность, сделаем это,
умножим на 2 каждый элемент последовательности, незабываем,
что функция map возвращает особый объект типа map и
его требуется явно превращать в последовательность.
some_list = [1, 2, 3, 4, 5]
result_1 = list(map(lambda x: x*2, some_list))
print(result_1)
# Вывод
# [2, 4, 6, 8, 10]Пример №4
Можно использовать специальную функцию filter для фильтрации
последовательности, совместно с функцией lambda. Напишем 2
функции, одна фильтрует список и возвращает все четные
элементы, другая после фильтрации возвращает нечетные элементы
some_list = [-5, -3, -1, 0, 1, 2, 3, 4, 5, 10, 20, 21]
# Получить нечетные элементы
result_1 = list(filter(lambda number: True if number % 2 else False, some_list))
# Получить четные элементы
result_2 = list(filter(lambda number: False if number % 2 else True, some_list))
print('Получить нечетные элементы : ', result_1)
print('Получить четные элементы : ', result_2)
# Вывод
# Получить нечетные элементы : [-5, -3, -1, 1, 3, 5, 21]
# Получить четные элементы : [0, 2, 4, 10, 20]