Ноу Інти, лекція, елементи функціонального програмування
Анотація: Ця лекція може здатися незвичайною для того, хто використовує імперативні мови програмування (на кшталт Pascal, C ++ або Java). Проте, функціональний підхід дає програмісту потужні засоби, дозволяючи створювати не тільки більш компактний, але і більш стійкий до помилок програмний код. Зовсім не обов'язково писати за допомогою Python чисто функціональні програми, але необхідно навчитися бачити, де елементи функціонального програмування принесуть максимальний ефект.
Функції є абстракціями. в яких деталі реалізації деякого дії ховаються за окремим ім'ям. Добре написаний набір функцій дозволяє використовувати їх багато разів. Стандартна бібліотека Python містить безліч готових і налагоджених функцій, багато з яких досить універсальні, щоб працювати з широким спектром вхідних даних. Навіть якщо деяка ділянка коду не використовується кілька разів, але по вхідних і вихідних даних він досить автономний, його сміливо можна виділити в окрему функцію.
Ця лекція більш орієнтована на практичні міркування, а не на теорію функціонального програмування. Однак там, де потрібно, будуть вживатися і пояснюватися відповідні терміни.
Далі будуть детально розглянуті опис і використання функцій в Python. рекурсія. передача і повернення функцій в якості параметрів, обробка послідовностей і ітератори. а також таке поняття як генератор. Буде продемонстровано, що в Python функції є об'єктами (і, отже, можуть бути передані в якості параметрів і повернуті в результаті виконання функцій). Крім того, мова піде про те, як можна реалізувати деякі механізми функціонального програмування, що не мають в Python прямий синтаксичної підтримки, але широко поширені в мовах функціонального програмування.
Що таке функціональне програмування?
Функціональне програмування - це стиль програмування, що використовує тільки композиції функцій. Іншими словами, це програмування в виразах, а не в імперативних командах.
Як зазначає Девід Мертц (David Mertz) в своїй статті про функціональне програмуванні на Python. "Функціональне програмування - програмування на функціональних мовами (LISP. ML, OCAML, Haskell.)", Основними атрибутами яких є:
- "Наявність функцій першого класу" (функції нарівні з іншими об'єктами можна передавати всередину функцій).
- Рекурсія є головною керуючою структурою в програмі.
- Обробка списків (послідовностей).
- Заборона побічних ефектів у функцій, що в першу чергу означає відсутність присвоювання (в "чистих" функціональних мовах)
- Заборона операторів, основний упор робиться на вираження. Замість операторів вся програма в ідеалі - один вислів з супутніми визначеннями.
- Ключове питання: що потрібно обчислити, а не як.
- Використання функцій вищих порядків (функції над функціями над функціями).
функціональна програма
В математиці функція відображає об'єкти з одного безлічі (безлічі визначення функції) в інше (безліч значень функції). Математичні функції (їх називають чистими) "механічно", однозначно обчислюють результат по заданих аргументів. Чисті функції не повинні зберігати в собі будь-які дані між двома викликами. Їх можна уявляти собі чорними ящиками, про яких відомо тільки те, що вони роблять, але зовсім не важливо, як.
Програми в функціональному стилі конструюються як композиція функцій. При цьому функції розуміються майже так само, як і в математиці: вони відображають одні об'єкти в інші. У програмуванні "чисті" функції - ідеал, не завжди досяжний на практиці. Практично корисні функції зазвичай мають побічний ефект. зберігають стан між викликами або змінюють стан інших об'єктів. Наприклад, без побічних ефектів неможливо уявити собі функції введення-виведення. Власне, такі функції заради цих "ефектів" і використовуються. Крім того, математичні функції легко працюють з об'єктами, які вимагають нескінченного обсягу інформації (наприклад, речові числа). У загальному випадку комп'ютерна програма може виконати лише наближені обчислення.
До речі, бінарні операції "+", "-", "*", "/", які записуються в виразах, є "математичними" функціями над двома аргументами - операндами. Їх використовують настільки часто, що синтаксис мови програмування має для них більш коротку запис. Модуль operator дозволяє представляти ці операції в функціональному стилі: