Введение в функциональное программирование на примерах Python

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

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

Эта парадигма программирования может быть реализована на разных языках. Существует несколько функциональных языков программирования, таких как Closure, Erlang или Haskel. Многие языки поддерживают функциональное программирование в дополнение к другим парадигмам: C ++, C #, F #, Java, Python, JavaScript и другие.

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

  • чистые функции,
  • анонимные функции,
  • рекурсивные функции,
  • первоклассные функции,
  • неизменные типы данных.

Чистые функции

Чистая функция — это функция, которая:

  • идемпотент — возвращает тот же результат, если предоставлены одинаковые аргументы,
  • не имеет побочных эффектов.

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

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

Чистые функции обычно не используют объекты из внешних областей и поэтому избегают общих состояний. Это может упростить программу и помочь избежать некоторых ошибок.

Анонимные функции

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

В Python вы создаете анонимную функцию с ключевым словом lambda:

Вышеприведенный оператор создает функцию, которая принимает два аргумента и возвращает их сумму. В следующем примере функции f и g делают то же самое:

Рекурсивные функции

Рекурсивная функция — это функция, которая вызывает себя во время выполнения. Например, мы можем использовать рекурсию, чтобы найти факториал в функциональном стиле:

В качестве альтернативы, мы можем решить ту же проблему с помощью цикла while или for:

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

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

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

Приведенный ниже код иллюстрирует передачу встроенной функции max в качестве аргумента функции f и вызов ее изнутри f.

Очень важными концепциями функционального программирования являются:

  • отображение,
  • фильтрация,
  • сокращение.

Все они поддерживаются в Python.

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

В этом примере встроенная функция abs вызывается с аргументами -2, -1, 0, 1 и 2 соответственно. Мы можем получить тот же результат с пониманием списка:

Нам не нужно использовать встроенные функции. Можно предоставить пользовательскую функцию (или метод, или любую вызываемую функцию). Лямбда-функции могут быть особенно удобны в таких случаях:

Вышеприведенное утверждение умножило каждый элемент списка [-2, -1, 0, 1, 2] на 2 с помощью пользовательской (лямбда) функции lambda item: 2 * item. Конечно, мы можем использовать понимание, чтобы достичь того же:

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

Вышеприведенная инструкция возвращает список неотрицательных элементов [-2, -1, 0, 1, 2], как определено функцией лямбда-элемента: item> = 0. Опять же, тот же результат может быть достигнут с использованием понимания :

Редукция выполняется с помощью функции Reduction из модуля functools. Опять же, он принимает два аргумента: функцию и повторяемость. Он вызывает функцию для первых двух элементов итерируемого, затем для результата этой операции и третьего элемента и так далее. Возвращает одно значение. Например, мы можем найти сумму всех элементов списка следующим образом:

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

Неизменные типы данных

Неизменяемый объект — это объект, состояние которого нельзя изменить после его создания. Наоборот, изменчивый объект допускает изменения в его состоянии.

Неизменяемые объекты обычно желательны в функциональном программировании.

Например, в Python списки изменчивы, а кортежи неизменны:

Мы можем изменять списки, добавляя к ним новые элементы, но когда мы пытаемся сделать это с кортежами, они не изменяются, а создаются новые экземпляры:

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

Основные концепции и принципы — особенно функции высшего порядка, неизменные данные и отсутствие побочных эффектов — подразумевают важные преимущества функциональных программ:

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

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

0

Автор публикации

не в сети 3 часа

admin

10K
Комментарии: 0Публикации: 331Регистрация: 21-04-2017

Добавить комментарий

Войти с помощью: