Функциональное программирование

Функциональное программирование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).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

results matching ""

    No results matching ""