Функциональное программирование
Функциональное программирование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).wiki
Функция высшего порядка — в программировании функция, принимающая в качестве аргументов другие функции или возвращающая другую функцию в качестве результата.
map() - применить функцию ко всем элементам списка
map(function_to_apply, iterable, ...) - применяет функцию _function_to_apply ко всем элементам последовательности iterable. Если заданы дополнительные аргументы (последовательности), то функция function_to_apply должна принимать столько аргументов, сколько последовательностей переданно далее в map.
a = map(int, input().split()) # 3 14 27 -1
Далее по полученному объекту типа map можно итерироваться.
for x in a:
print(x)
# 3
# 14
# 27
# -1
Еще о различиях map и list:
>>> a = map(int, input().split())
3 14 27 -1 # ввели эти числа
>>> a # map - это не список
<map object at 0xffd87170>
>>> print(a)
<map object at 0xffd87170>
>>> b = list(a) # но из map можно получить list
>>> b
[3, 14, 27, -1]
>>> c = list(a)
>>> c # итерироваться можно только ОДИН раз!!!
[]
map - пример: квадраты чисел
Посчитаем квадраты чисел, заданных в списке.
Обычная функция:
items = [1, 2, 3, 4, 5]
squared = []
for i in items:
squared.append(i**2)
map:
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
map - пример: задаем числа и их степени
Возведем числа из списка в степени, которые тоже заданы списком
Обычная функция:
items = [10, 2, 3, 4]
n = [ 3, 1, 2, 0]
res = []
for i, x in enumerate(items):
res.append(x**n[i]))
map:
items = [10, 2, 3, 4]
n = [ 3, 1, 2, 0]
res = list(map((lambda x, i: x**i), items, n))
map - список входных данных может быть списком функций
def multiply(x):
return (x*x)
def add(x):
return (x+x)
funcs = [multiply, add]
for i in range(5):
value = list(map(lambda x: x(i), funcs))
print(value)
# Вывод:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]
filter() - оставить те элементы, для которых True фильтрующая фукнция
filter(filter_function, list_of_inputs) - оставить только те элементы списка list_of_inputs, у которых применение функции filter_function вернуло True.
number_list = range(-5, 5)
less_than_zero = list(filter(lambda x: x < 0, number_list))
print(less_than_zero)
# Вывод: [-5, -4, -3, -2, -1]
filer похож на цикл, но он является встроенной функцией и работает быстрее.
reduce() - свертка списка с помощью функции
В Python 3 встроенной функции reduce() нет, но её можно найти в модуле functools.
reduce(function_to_apply, list_of_inputs, init_value) - сворачивает элементы списка list_of_inputs в один объект, применяя function_to_apply по очереди к последовательным парам элементов. Предполагая для первой пары init_value - необязательный параметр.
Найдем произведение чисел из списка. Классический вариант:
product = 1
list = [1, 2, 3, 4]
for num in list:
product = product * num
# product = 24
С reduce:
from functools import reduce
product = reduce((lambda res, x: res * x), [1, 2, 3, 4]) # 24
product = reduce((lambda res, x: res * x), [1, 2, 3, 4], 1) # эквивалентно
Порядок вычислений:
(((2*3)*4)*5)*6
Цепочка вызовов связывается с помощью промежуточного результата (res). Если список пустой, просто используется третий параметр (в случае произведения нуля множителей это 1):
reduce(lambda res, x: res*x, [], 1) # 1
Реверс списка (если забыли про функцию reversed):
>>> reduce(lambda res, x: [x]+res, [1, 2, 3, 4], [])
[4, 3, 2, 1]
sum - сумма элементов списка
all
all(iterable) - возвращает True если все элементы в iterable истины (или этот iterable пустой). То же самое, что:
def all(iterable):
for element in iterable:
if not element:
return False
return True
any
any(iterable) - возвращает True если хоть один элемент в iterable истин (если этот iterable пустой, возвращается False). То же самое, что:
def any(iterable):
for element in iterable:
if element:
return True
return False