Рубрики
Без рубрики

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

В этом руководстве мы узнаем основы функционального программирования и поймем, как реализовать его в Python с некоторыми примерами. Мы также посмотрим на

Автор оригинала: Pankaj Kumar.

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

В этом руководстве мы узнаем основы функционального программирования и поймем, как реализовать его в Python с некоторыми примерами. Мы также посмотрим, что являются преимуществами и недостатками функционального программирования.

Что такое функциональное программирование?

Функциональное программирование – это просто другая парадигма программирования в качестве процессуального программирования и объектно-ориентированного программирования.

В функциональном программировании вместо записи операторов для создания вывода мы применяем последовательность функций для получения вывода.

Он может быть использован в тех случаях, когда конечный результат и промежуточные или начальные значения не имеют физических зависимостей друг от друга.

Для этого мы разлагаемся с проблемой в простых функциях и используем последовательность одноразовых функций для выполнения сложной задачи.

Как реализовать функциональное программирование в Python?

Для реализации функционального программирования в Python мы разлагаемся к проблеме в чистых функциях, а затем мы применяем функции декларативным способом в последовательности для получения выхода.

По чистым функциям, мы имеем в виду, что вывод функций не должен зависеть от глобальных переменных и состояний программы, и он не должен производить какой-либо побочный эффект .

То есть вывод функций, используемых в функциональном программировании, должен зависеть только от ввода.

В этой статье мы будем работать с карта () , Фильтр () и Уменьшить () Методы для преобразования процедурной программы в функциональную программу.

1. Функция карты () в Python

Функция MAP () принимает функцию в качестве своего первого аргумента и итеративный объект в качестве второго аргумента или любое количество повторных документов после этого. Затем он возвращает объект карты после применения функции на каждом элементе входных данных. Затем мы можем преобразовать объект карты к типу Iterable, который мы хотим.

#define the function that increments a number by 1 
def increment_by_one(number):
    return number+1

#define a list
numbers= [1,3,45,67,34,78,23,56,98,104,123]
print("input list to increment values by 1 is:")
print(numbers)

#procedural way to get a list containing incremented elements by 1
result=[]
for num in numbers:
    result.append(increment_by_one(num))
print("Result obtained through procedural way is:")
print(result)

#functional way to obtain a list containing incremented elements by 1
resultbyfunc=map(increment_by_one,numbers)
print("Result obtained through functional way is:")
print(list(resultbyfunc))

Выход:

input list to increment values by 1 is:
[1, 3, 45, 67, 34, 78, 23, 56, 98, 104, 123]
Result obtained through procedural way is:
[2, 4, 46, 68, 35, 79, 24, 57, 99, 105, 124]
Result obtained through functional way is:
[2, 4, 46, 68, 35, 79, 24, 57, 99, 105, 124]

2. Функция Filter () в Python

Функция FILTER () применяет функцию на съемке, которая тестирует каждый элемент ввода, который является измененным для условия и возвращает TRUE или FALSE.

Требуется функция в качестве первого аргумента, а другие аргументы являются имитенами, на которых необходимо применять функцию ввода. После выполнения Filter () также возвращает итератор, который передает только те элементы входных данных, которые вернулись True при передаче в функции ввода.

#define the function that returns true when passed an even number as input
def check_if_even(number):
    if number%2==0:
        return True
    else:
        return False

#define a list
numbers= [1,3,45,67,34,78,23,56,98,104,123]
print("input list to filter even numbers is:")
print(numbers)

#procedural way to get a list containing even numbers from input list
result=[]
for num in numbers:
    if check_if_even(num)==True:
        result.append(num)
print("Result obtained through procedural way is:")
print(result)

#functional way to obtain a list containing even numbers from input list
resultbyfunc=filter(check_if_even,numbers)
print("Result obtained through functional way is:")
print(list(resultbyfunc))

Выход:

input list to filter even numbers is:
[1, 3, 45, 67, 34, 78, 23, 56, 98, 104, 123]
Result obtained through procedural way is:
[34, 78, 56, 98, 104]
Result obtained through functional way is:
[34, 78, 56, 98, 104]

3. Уменьшить () Функция в Python

Уменьшить () Метод используется для генерации совокупных значений, таких как сумма всех элементов утилизации. Это определено в Functools модуль.

Мы можем пройти функцию, которая принимает два аргумента и возвращает накопленный вывод в качестве первого аргумента для уменьшения () и, как и второй аргумент.

Уменьшить () Применяет функцию ввода к элементам ввода, имеющих входящую, слева направо и уменьшает его для одного совокупного значения и возвращает значение.

Вот пример, который использует как процедурный способ, так и Уменьшить () Функция, чтобы найти сумму элементов списка.

#import reduce function
from functools import reduce
#define the function that returns the sum of two numbers when passed as input

def add(num1,num2):
    return num1+num2

#define a list
numbers= [1,3,45,67,34,78,23,56,98,104,123]
print("input list to find sum of elements is:")
print(numbers)

#procedural way to get the sum of numbers from input list
result=0
for num in numbers:
    result=result+num
print("Result obtained through procedural way is:")
print(result)

#functional way to obtain the sum of numbers from input list
resultbyfunc=reduce(add,numbers)
print("Result obtained through functional way is:")
print(resultbyfunc)

Выход:

input list to find sum of elements is:
[1, 3, 45, 67, 34, 78, 23, 56, 98, 104, 123]
Result obtained through procedural way is:
632
Result obtained through functional way is:
632

Теперь мы увидим пример, чтобы понять, как использовать функциональное программирование.

Преобразование процедурной программы в функциональную программу

Предположим, нам дают список чисел, и мы должны Найти сумму квадратов четных чисел, которые делится на 5 в списке Отказ

Мы будем использовать процедурную и функциональную парадигму для реализации решения вопроса и попытайтесь увидеть различия между программой.

Ниже приводится процедурный способ внедрения решения вышеуказанной проблемы.

#define a function that returns square of a number 
def square(num):
    return num*num

#define a function that checks if a number is even
def is_even(num):
    if num%2==0:
        return True
    else:
        return False

#define a function that checks divisibility by 5
def is_divisible_by_five(num):
    if num%5==0:
        return True
    else:
        return False

#define a list
numbers= [1,20,45,67,34,78,80,23,56,98,104,50,60,90,123]
print("input list to find the solution is:")
print(numbers)

#procedural way to find the solution
#extract elements which are dvisible by 5 and are even
temp=[]
for num in numbers:
    if is_even(num) and is_divisible_by_five(num):
        temp.append(num)

#calculate square of elements in temp
sqtemp=[]
for num in temp:
    sqtemp.append(square(num))

#find sum of squared elements
result=0
for num in sqtemp:
    result=result+num

print("Result obtained through procedural way is:")
print(result)

Выход

input list to find the solution is:
[1, 20, 45, 67, 34, 78, 80, 23, 56, 98, 104, 50, 60, 90, 123]
Result obtained through procedural way is:
21000

Теперь мы реализуем вышеуказанный код в функциональной парадигме следующим образом.

#import reduce function
from functools import reduce

#define the function that returns sum of two numbers when passed as input
def add(num1,num2):
    return num1+num2

#define a function that returns square of a number 
def square(num):
    return num*num

#define a function that checks if a number is even
def is_even(num):
    if num%2==0:
        return True
    else:
        return False
#define a function that checks divisibility by 5
def is_divisible_by_five(num):
    if num%5==0:
        return True
    else:
        return False

#define a list
numbers= [1,20,45,67,34,78,80,23,56,98,104,50,60,90,123]
print("input list to find the solution is:")
print(numbers)

#functional way to find the solution
#filter numbers divisible by 5
temp1=filter(is_divisible_by_five,numbers)

#filter even numbers
temp2=filter(is_even,temp1)

#find square of numbers
temp3=map(square,temp2)

#find sum of squares
result=reduce(add,temp3)
print("Result obtained through functional way is:")
print(result)

Выход:

input list to find the solution is:
[1, 20, 45, 67, 34, 78, 80, 23, 56, 98, 104, 50, 60, 90, 123]
Result obtained through functional way is:
21000

Различия между процедурным и функциональным программированием

  • В процессуальном программировании мы используем последовательность инструкций с использованием условных операторов и петлей для реализации нашего примера, когда мы только что сделали вызовы функций, передавая их данные и передавали возвращенные значения в другую функцию для получения результата. Условный оператор не использовался в реализации основной логики.
  • В функциональном программировании мы используем чистые функции, и они выполняют очень простые операции, поскольку мы сделали в нашем примере, но функции в процедурных программах могут быть очень сложными и могут иметь побочные эффекты.
  • В качестве процедурных программ включают условия, они трудно отлаживать, тогда как функциональные программы являются декларативными, и каждая функция имеет фиксированную работу без побочного эффекта, что делает их легко отладки.

Преимущества функционального программирования

Как видно в приведенных выше примерах, следующие преимущества функционального программирования:

  • Как мы используем чистые функции в функциональном программировании, отладки становится легкой.
  • Воспроизводимость чистых функций высока, и он только завершает одну операцию в вызове, поэтому использование чистых функций увеличивает модульность программы.
  • Читаемость функциональных программ высока, потому что программа является декларативной, и нет условных утверждений.

Когда вы должны использовать функциональное программирование?

Функциональное программирование лучше всего делать математические вычисления. Если вы решаете сложные математические программы, которые можно разделить на ядерные шаги, функциональное программирование является лучшим выбором для ситуации.

Когда вы не должны использовать функциональное программирование?

  • Вы не должны использовать функциональное программирование, если вы начинаете при программировании. Наш разум обучен понимать последовательности и изначально, трудно понять даже процедурные программы.
  • Если вы работаете над крупным проектом, избегайте использования функционального программирования, поскольку поддержание функциональных программ трудно во время фазы кодирования.
  • Повторное использование кода – очень сложная задача в функциональном программировании, поэтому вам нужно быть действительно хорошо, чтобы сохранить время и усилия.

Заключение

В этом руководстве мы видели, какое функциональное программирование и как реализовать его в Python. Мы также видели, каковы различия между процессуальным и функциональным программированием, каковы преимущества функционального программирования, и следует ли использовать функциональное программирование для данной задачи.