Функции: синтаксис и аргументы

Функции — главная единица кода в Julia. Разбираем все формы их записи и виды аргументов.

Функция в Julia — это именованный блок кода, принимающий аргументы. Возвращается значение последнего выражения, даже без слова return.

Два способа объявления

Полная форма с function ... end и краткая «однострочная» — для простых функций:

# полная форма
function square(x)
    return x^2
end

# краткая форма — почти как формула
cube(x) = x^3

println(square(4))
println(cube(3))

Вывод:

16
27

Краткая форма особенно ценна в научном коде: математическую функцию f(x) = 2x + 1 можно записать буквально так, как в учебнике.

Множественный возврат

Функция может вернуть несколько значений через запятую — на самом деле это кортеж (tuple), который удобно «распаковать»:

function minmax(v)
    return minimum(v), maximum(v)
end

lo, hi = minmax([3, 7, 1, 9, 4])
println("мин=$lo, макс=$hi")

Вывод:

мин=1, макс=9

Аргументы по умолчанию

greet(name, greeting="Привет") = "$greeting, $name!"
println(greet("Анна"))
println(greet("Иван", "Здравствуйте"))

Вывод:

Привет, Анна!
Здравствуйте, Иван!

Именованные аргументы

Аргументы после точки с запятой в сигнатуре — именованные: при вызове их передают по имени, порядок не важен:

function rectangle(; width, height)
    return width * height
end

println(rectangle(height=3, width=5))

Вывод:

15

Анонимные функции

Безымянная функция записывается через стрелку -> и часто передаётся в map, filter, sort:

nums = [1, 2, 3, 4, 5]
println(map(x -> x * 10, nums))
println(filter(x -> x > 2, nums))

Вывод:

[10, 20, 30, 40, 50]
[3, 4, 5]

Как работает под капотом

В Julia функция — это не просто блок кода, а набор методов для разных типов аргументов. Когда вы пишете square(x), при первом вызове с Int Julia компилирует версию для целых, при вызове с Float64 — отдельную версию для дробных. Эта идея «много реализаций одной функции под разные типы» называется множественной диспетчеризацией — главная тема следующего раздела. Именно поэтому в Julia принято писать много маленьких функций: каждая компилируется в быстрый специализированный код.

Частые ошибки

Частая путаница — разница между позиционными аргументами по умолчанию (до точки с запятой) и именованными (после неё). Именованные нужно передавать по имени: rectangle(width=5, height=3), а не rectangle(5, 3). Вторая ошибка — забыть, что функция и без return вернёт значение последнего выражения; иногда это приводит к неожиданному возврату nothing, если последняя строка — это, например, println.

Итоги

  • Краткая форма f(x) = выражение идеальна для математических функций.
  • Возврат нескольких значений через запятую даёт кортеж для распаковки.
  • Аргументы по умолчанию — позиционные; именованные ставят после ; и передают по имени.
  • Анонимные функции пишут через -> для map, filter и т. п.
  • Функция возвращает значение последнего выражения даже без return.
Проверьте себя
1. Как в Julia кратко записать функцию, возводящую x в квадрат?
Adef square(x): x^2
Bsquare(x) = x^2
Cfunction square(x) -> x^2
Dsquare = x^2
2. Где в сигнатуре функции располагаются именованные аргументы?
AВ самом начале, до имени
BПосле точки с запятой в списке аргументов
CТолько внутри тела через return
DИменованных аргументов в Julia нет
3. Что вернёт функция, у которой нет слова return?
AВсегда nothing
BЗначение последнего вычисленного выражения
CОшибку компиляции
DВсе промежуточные значения списком