Функції в KDB

Функції в KDB+ є основними будівельними блоками, які дозволяють створювати багаторазовий та модульний код, як і в будь-якій іншій мові програмування.

Синтаксис функцій

  • Загальна структура
  1. Лямбда-функція
{expression}
  1. Лямбда-функція з параметрами
{[parameters] expression}
  1. Присвоєння
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)

Загальні використання функцій

  1. Математичні операції
square:{x*x}  
square[5] // Повертає 25
  1. Трансформація даних
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)

Leave a Reply

Your email address will not be published. Required fields are marked *