Функції в KDB+ є основними будівельними блоками, які дозволяють створювати багаторазовий та модульний код, як і в будь-якій іншій мові програмування.
Синтаксис функцій
- Загальна структура
- Лямбда-функція
{expression}
- Лямбда-функція з параметрами
{[parameters] expression}
- Присвоєння
fun_name:{[parameters] expression}
- Параметри
Параметри визначаються всередині квадратних дужок ([]).
Параметри є позиційними і можуть бути необов'язковими з використанням значень за замовчуванням.
addDefault:{[x;y:10] x+y} // Значення за замовчуванням для y - 10
addDefault[5] // Повертає 15
Типи функцій
- Анонімні функції
Це функції без імені, які створюються безпосередньо за допомогою лямбди ({}
).
Зазвичай використовується для малих, внутрішніх операцій.
{[parameters] expression}
Приклад:
f:{[x;y] x+y} // Функція, яка додає два числа
f[3;4] // Повертає 7
- Іменовані функції
Це функції, які присвоюються змінній, що дозволяє їх повторно використовувати.
func_name:{[parameters] expression}
Приклад:
add:{[x;y] x+y}
add[5;6] // Повертає 11
- Проекція
Часткова застосування функції з фіксованими деякими аргументами.
add10:add[10;] // Фіксуємо перший аргумент на 10
add10[5] // Повертає 15
- Прислівники та функціональні модифікатори
Модифікують поведінку функцій. Приклади: each
, over
, scan
.
add:{x+y}
add each (1 2 3; 4 5 6) // Повертає (5 7 9)
Загальні використання функцій
- Математичні операції
square:{x*x}
square[5] // Повертає 25
- Трансформація даних
double:{x*2}
double each 1 2 3 // Повертає 2 4 6
3.
Умови
greaterThan5:{if[x>5; "Greater"; "Smaller"]}
greaterThan5[7] // Повертає "Greater"
4.
Агрегація
sumList:{sum x}
sumList 1 2 3 4 // Повертає 10
Розширені можливості
- Динамічні функції
Функції можуть створювати інші функції динамічно.
makeMultiplier:{[n] {x*n}}
times3:makeMultiplier[3]
times3[4] // Повертає 12
- Локальні функції
Використовуйте “:” для присвоєння значень локальним змінним всередині функції.
factorial:{[n] result:1; result:result*1_til n+1; result}
factorial[5] // Повертає 120
- Рекурсія
Функції можуть викликати самі себе.
factorial:{if[x=1; 1; x*factorial[x-1]]}
factorial[5] // Повертає 120
- Контекст і область видимості
Локальні змінні мають область видимості лише в межах функції.
Глобальні змінні можуть бути доступні або змінювані, якщо вони не приховані.
Інлайн-функції та збережені функції
- Інлайн-функції
Функції, написані безпосередньо як вирази.
{x+y}[3;4] // Повертає 7
- Збережені функції
Функції, присвоєні змінній і збережені в пам'яті для подальшого використання.
add:{x+y}
add[3;4] // Повертає 7
Вбудовані функціональні модифікатори
- each ('')
Застосовує функцію до кожного елемента списку.
square each 1 2 3 // Повертає 1 4 9
- over ('/')
Застосовує бінарну функцію кілька разів, зменшуючи список до одного значення.
+/ 1 2 3 4 // Підсумовує список, повертає 10
- scan ('\')
Застосовує бінарну функцію кумулятивно, отримуючи проміжні результати.
+\ 1 2 3 4 // Повертає 1 3 6 10
- each-left ('[\') та each-right ('/')
Застосовує функцію до комбінацій двох списків.
1 +/:\ 2 3 // Додає кожну пару, повертає (3 4)
Роздуми про продуктивність
- Використовуйте векторизовані операції там, де це можливо для підвищення ефективності.
- Уникайте глибокої рекурсії для великих наборів даних; надавайте перевагу ітеративним підходам.
- Використовуйте
set
для присвоєння функцій змінним у пам'яті для кращої продуктивності.
Приклади
Приклад 1: Фільтрація парних чисел
isEven:{x mod 2 = 0}
filterEven:{x where isEven each x}
filterEven 1 2 3 4 5 6 // Повертає 2 4 6
Приклад 2: Генерація послідовності Фібоначчі
fibonacci:{[n]
if[n<2; n; fibonacci[n-1]+fibonacci[n-2]]
}
fibonacci[10] // Повертає 55
Приклад 3: Застосування власної агрегації
average:{sum x % count x}
average 1 2 3 4 5 // Повертає 3
Перекладено з: [Functions in KDB](https://medium.com/@saitarun2499/functions-in-kdb-19728eda0d90?source=rss------database-5)