Функциональным называется такой подход к процессу программирования, в программа рассматривается как вычисление математических функций, при этом не используются состояния и изменяемые объекты. Как правило, когда говорят о элементах функционального программировании в Python, то подразумеваются следующие функции: lambda, map, filter, reduce, zip.
- Lambda выражение в Python.
- Функция map() в Python.
- Функция filter() в Python.
- Функция reduce() в Python.
- Функция zip() в Python.
Lambda выражение в Python:
lambda оператор или lambda функция в Python это способ создать анонимную функцию, то есть функцию без имени. Такие функции можно назвать одноразовыми, они используются только при создании. Как правило, lambda функции используются в комбинации с функциями filter, map, reduce.
Синтаксис lambda выражения в Python
lambda arguments: expression
В качестве arguments передается список аргументов, разделенных запятой, после чего над переданными аргументами выполняется expression. Если присвоить lambda-функцию переменной, то получим поведение как в обычной функции (делаем мы это исключительно в целях демонстрации)
>>> multiply = lambda x,y: x * y >>> multiply(21, 2) 42
Но, конечно же, все преимущества lambda-выражений мы получаем, используя lambda в связке с другими функциями
Функция map() в Python:
В Python функция map принимает два аргумента: функцию и аргумент составного типа данных, например, список. map применяет к каждому элементу списка переданную функцию. Например, вы прочитали из файла список чисел, изначально все эти числа имеют строковый тип данных, чтобы работать с ними - нужно превратить их в целое число:
old_list = ['1', '2', '3', '4', '5', '6', '7'] new_list = [] for item in old_list: new_list.append(int(item)) print (new_list) [1, 2, 3, 4, 5, 6, 7]
Тот же эффект мы можем получить, применив функцию map:
old_list = ['1', '2', '3', '4', '5', '6', '7'] new_list = list(map(int, old_list)) print (new_list) [1, 2, 3, 4, 5, 6, 7]
Как видите такой способ занимает меньше строк, более читабелен и выполняется быстрее. map также работает и с функциями созданными пользователем:
def miles_to_kilometers(num_miles): """ Converts miles to the kilometers """ return num_miles * 1.6 mile_distances = [1.0, 6.5, 17.4, 2.4, 9] kilometer_distances = list(map(miles_to_kilometers, mile_distances)) print (kilometer_distances) [1.6, 10.4, 27.84, 3.84, 14.4]
А теперь то же самое, только используя lambda выражение:
mile_distances = [1.0, 6.5, 17.4, 2.4, 9] kilometer_distances = list(map(lambda x: x * 1.6, mile_distances)) print (kilometer_distances) [1.6, 10.4, 27.84, 3.84, 14.4]
Функция map может быть так же применена для нескольких списков, в таком случае функция-аргумент должна принимать количество аргументов, соответствующее количеству списков:
l1 = [1,2,3] l2 = [4,5,6] new_list = list(map(lambda x,y: x + y, l1, l2)) print (new_list) [5, 7, 9]
Если же количество элементов в списках совпадать не будет, то выполнение закончится на минимальном списке:
l1 = [1,2,3] l2 = [4,5] new_list = list(map(lambda x,y: + y, l1, l2)) print (new_list) [5,7]
Функция filter() в Python:
Функция filter предлагает элегантный вариант фильтрации элементов последовательности. Принимает в качестве аргументов функцию и последовательность, которую необходимо отфильтровать:
mixed = ['мак', 'просо', 'мак', 'мак', 'просо', 'мак', 'просо', 'просо', 'просо', 'мак'] zolushka = list(filter(lambda x: x == 'мак', mixed)) print (zolushka) ['мак', 'мак', 'мак', 'мак', 'мак']
Обратите внимание, что функция, передаваемая в filter должна возвращать значение True / False, чтобы элементы корректно отфильтровались.
Функция reduce() в Python:
Функция reduce принимает 2 аргумента: функцию и последовательность. reduce() последовательно применяет функцию-аргумент к элементам списка, возвращает единичное значение. Обратите внимание в Python 2.x функция reduce доступна как встроенная, в то время, как в Python 3 она была перемещена в модуль functools.
Вычисление суммы всех элементов списка при помощи reduce:
from functools import reduce items = [1,2,3,4,5] sum_all = reduce(lambda x,y: x + y, items) print (sum_all) 15
Вычисление наибольшего элемента в списке при помощи reduce:
from functools import reduce items = [1, 24, 17, 14, 9, 32, 2] all_max = reduce(lambda a,b: a if (a > b) else b, items) print (all_max) 32
Функция zip() в Python:
Функция zip объединяет в кортежи элементы из последовательностей переданных в качестве аргументов.
a = [1,2,3] b = "xyz" c = (None, True) res = list(zip(a, b, c)) print (res) [(1, 'x', None), (2, 'y', True)]
Обратите внимание, что zip прекращает выполнение, как только достигнут конец самого короткого списка.