Ноу Інти, лекція, елементи функціонального програмування

Анотація: Ця лекція може здатися незвичайною для того, хто використовує імперативні мови програмування (на кшталт Pascal, C ++ або Java). Проте, функціональний підхід дає програмісту потужні засоби, дозволяючи створювати не тільки більш компактний, але і більш стійкий до помилок програмний код. Зовсім не обов'язково писати за допомогою Python чисто функціональні програми, але необхідно навчитися бачити, де елементи функціонального програмування принесуть максимальний ефект.

Функції є абстракціями. в яких деталі реалізації деякого дії ховаються за окремим ім'ям. Добре написаний набір функцій дозволяє використовувати їх багато разів. Стандартна бібліотека Python містить безліч готових і налагоджених функцій, багато з яких досить універсальні, щоб працювати з широким спектром вхідних даних. Навіть якщо деяка ділянка коду не використовується кілька разів, але по вхідних і вихідних даних він досить автономний, його сміливо можна виділити в окрему функцію.

Ця лекція більш орієнтована на практичні міркування, а не на теорію функціонального програмування. Однак там, де потрібно, будуть вживатися і пояснюватися відповідні терміни.

Далі будуть детально розглянуті опис і використання функцій в Python. рекурсія. передача і повернення функцій в якості параметрів, обробка послідовностей і ітератори. а також таке поняття як генератор. Буде продемонстровано, що в Python функції є об'єктами (і, отже, можуть бути передані в якості параметрів і повернуті в результаті виконання функцій). Крім того, мова піде про те, як можна реалізувати деякі механізми функціонального програмування, що не мають в Python прямий синтаксичної підтримки, але широко поширені в мовах функціонального програмування.

Що таке функціональне програмування?

Функціональне програмування - це стиль програмування, що використовує тільки композиції функцій. Іншими словами, це програмування в виразах, а не в імперативних командах.

Як зазначає Девід Мертц (David Mertz) в своїй статті про функціональне програмуванні на Python. "Функціональне програмування - програмування на функціональних мовами (LISP. ML, OCAML, Haskell.)", Основними атрибутами яких є:

  • "Наявність функцій першого класу" (функції нарівні з іншими об'єктами можна передавати всередину функцій).
  • Рекурсія є головною керуючою структурою в програмі.
  • Обробка списків (послідовностей).
  • Заборона побічних ефектів у функцій, що в першу чергу означає відсутність присвоювання (в "чистих" функціональних мовах)
  • Заборона операторів, основний упор робиться на вираження. Замість операторів вся програма в ідеалі - один вислів з супутніми визначеннями.
  • Ключове питання: що потрібно обчислити, а не як.
  • Використання функцій вищих порядків (функції над функціями над функціями).

функціональна програма

В математиці функція відображає об'єкти з одного безлічі (безлічі визначення функції) в інше (безліч значень функції). Математичні функції (їх називають чистими) "механічно", однозначно обчислюють результат по заданих аргументів. Чисті функції не повинні зберігати в собі будь-які дані між двома викликами. Їх можна уявляти собі чорними ящиками, про яких відомо тільки те, що вони роблять, але зовсім не важливо, як.

Програми в функціональному стилі конструюються як композиція функцій. При цьому функції розуміються майже так само, як і в математиці: вони відображають одні об'єкти в інші. У програмуванні "чисті" функції - ідеал, не завжди досяжний на практиці. Практично корисні функції зазвичай мають побічний ефект. зберігають стан між викликами або змінюють стан інших об'єктів. Наприклад, без побічних ефектів неможливо уявити собі функції введення-виведення. Власне, такі функції заради цих "ефектів" і використовуються. Крім того, математичні функції легко працюють з об'єктами, які вимагають нескінченного обсягу інформації (наприклад, речові числа). У загальному випадку комп'ютерна програма може виконати лише наближені обчислення.

До речі, бінарні операції "+", "-", "*", "/", які записуються в виразах, є "математичними" функціями над двома аргументами - операндами. Їх використовують настільки часто, що синтаксис мови програмування має для них більш коротку запис. Модуль operator дозволяє представляти ці операції в функціональному стилі:

Схожі статті