Functional Programming
Функціональне програмування⚑
Що таке функціональне програмування⚑
Функціональне програмування - це галузь дискретної математики та парадигма програмування, в якій процес обчислення трактується як обчислення значень функцій в математичному розумінні останніх (на відміну від функцій як підпрограм у процедурному програмуванні).
Воно протиставляється імперативній парадигмі програмування, яка описує процес обчислень як послідовну зміну станів (значень, подібних до таких у теорії автоматів).
Links
Підтримка функціонального програмування в Python⚑
Python частково підтримує парадигму функціонального програмування та дозволяє писати код у функціональному стилі. Крім того, в ньому присутні певні можливості, характерні для функціональних мов або вперше з'явилися у функціональних мовах (списковий вираз, лямбда-функції, функції вищого порядку і т.д.).
Що таке об'єкт першого класу⚑
Об'єктами першого класу (англ. first-class object, first-class entity, first-class citizen) у контексті певної мови програмування називаються сутності, які можуть бути передані як параметр, повернуті з функції або присвоєні змінній.
Об'єкт називають "об'єктом першого класу", якщо він: - може бути збережений у змінній або структурах даних; - може бути переданий в функцію як аргумент; - може бути повернутий з функції як результат; - може бути створений під час виконання програми; - внутрішньо самоідентифікується (незалежно від іменування).
Термін "об'єкт" використовується тут в загальному сенсі і не обмежується об'єктами мови програмування. У Python, так само як і в функціональних мовах, функції є об'єктами першого класу.
Що таке функція вищого порядку?⚑
Функція вищого порядку - це функція, яка приймає інші функції як аргументи або повертає іншу функцію як результат. Основна ідея полягає в тому, що функції мають такий же статус, як і інші об'єкти даних. Це є важливим концептом у функціональному програмуванні.
Python має кілька вбудованих функцій вищого порядку, таких як map()
, filter()
і reduce()
. - map()
- застосовує задану функцію до кожного елемента об'єкта, що ітерується, і повертає ітератор з результатами. - filter()
- застосовує задану функцію до кожного елемента об'єкта, що ітерується, і повертає ітератор з елементами, для яких функція повернула True. - reduce()
- поєднує елементи об'єкта, що ітерується, в одне значення, використовуючи задану функцію.
Що таке каррірування⚑
Каррірування - це перетворення функції з багатьма аргументами на набір функцій, кожна з яких є функцією від одного аргумента. Ми можемо передати частину аргументів до функції і отримати назад функцію, яка очікує інші аргументи. Це перетворення було запропоновано М.Шейнфінкелем і Г.Фреге і отримало свою назву на честь Х.Каррі.
Створимо просту функцію greet, яка приймає привітання та ім'я як аргументи:
Невелике поліпшення дозволить створити нову функцію для будь-якого типу привітання і передати цій новій функції ім'я:
def greet_curried(greeting):
def greet(name):
print(greeting + ', ' + name)
return greet
greet_hello = greet_curried('Hello')
greet_hello('German')
greet_hello('Ivan')
Або безпосередньо greet_curried
. Подальша розробка можлива з будь-якою кількістю аргументів.
greet_curried('Hi')('Roma')
def greet_deeply_curried(greeting):
def w_separator(separator):
def w_emphasis(emphasis):
def w_name(name):
print(greeting + separator + name + emphasis)
return w_name
return w_emphasis
return w_separator
greet = greet_deeply_curried("Hello")("...")(".")
greet('German')
greet('Ivan')
Опишіть функції map
, reduce
, filter
модуля functools⚑
Функція map
застосовує функцію до кожного елемента послідовності.
Функція filter
залишає тільки ті елементи послідовності, для яких задана функція є істинною.
Для Python більш канонічним є використання спискових виразів замість map-filter.
Функція reduce
приймає функцію з двома аргументами, послідовність і опціональне початкове значення і обчислює скорочення (складання) послідовності як результат послідовного застосування даної функції до поточного значення (так званого аккумулятора) і наступного елемента послідовності.