11.2 Определение функций
В простейшем виде определение функции с именем name выглядит так:
function name body endfunction
Допустимое имя функции, как и допустимое имя переменной, представляет собой последовательность букв, цифр и символов подчёркивания, не начинающуюся с цифры. Функции и переменные используют общий набор имён.
body функции состоит из операторов Octave. Это самая важная часть определения, поскольку именно здесь указывается, что функция должна фактически делать.
Например, ниже приведена функция, которая при выполнении подаст звуковой сигнал на терминале (если это возможно):
function wakeup
printf ("\a");
endfunction Оператор printf (см. Ввод и вывод) просто указывает Octave вывести строку "\a". Специальный символ ‘\a’ обозначает символ звукового сигнала (ASCII 7). См. раздел Строки.
После определения этой функции можно попросить Octave выполнить её, введя имя функции.
Обычно требуется передавать некоторую информацию функциям, которые вы определяете. Синтаксис передачи параметров функции в Octave выглядит так:
function name (arg-list) body endfunction
где arg-list — это список аргументов функции, разделённых запятыми. При вызове функции имена аргументов используются для хранения значений, переданных при вызове. Список аргументов может быть пустым; в этом случае данная форма эквивалентна приведённой выше.
Чтобы вывести сообщение и одновременно подать звуковой сигнал, можно изменить wakeup следующим образом:
function wakeup (message)
printf ("\a%s\n", message);
endfunction Вызов этой функции оператором вида
wakeup ("Rise and shine!"); заставит Octave подать звуковой сигнал на терминале и вывести сообщение ‘Rise and shine!’, за которым последует символ новой строки (символ ‘\n’ в первом аргументе оператора printf).
В большинстве случаев также требуется получать некоторую информацию от определяемых функций. Ниже приведён синтаксис функции, возвращающей одно значение:
function ret-var = name (arg-list) body endfunction
Символ ret-var — это имя переменной, в которой будет храниться значение, возвращаемое функцией. Чтобы функция вернула значение, эта переменная должна быть определена до завершения тела функции.
Переменные, используемые в теле функции, являются локальными для этой функции. Переменные, указанные в arg-list и ret-var, также являются локальными для функции. Информацию о доступе к глобальным переменным внутри функции см. в разделе Глобальные переменные.
Например, ниже приведена функция, вычисляющая среднее значение элементов вектора:
function retval = avg (v) retval = sum (v) / length (v); endfunction
Если бы мы написали avg следующим образом,
function retval = avg (v)
if (isvector (v))
retval = sum (v) / length (v);
endif
endfunction а затем вызвали функцию, передав в качестве аргумента матрицу, а не вектор, Octave вывел бы сообщение об ошибке примерно такого вида:
error: value on right hand side of assignment is undefined
поскольку тело оператора if ни разу не выполнялось, а переменная retval так и не была определена. Чтобы избежать подобных малопонятных ошибок, рекомендуется всегда следить за тем, чтобы возвращаемые переменные имели значения, и выводить содержательные сообщения об ошибках при возникновении проблем. Например, avg можно было бы написать так:
function retval = avg (v)
retval = 0;
if (isvector (v))
retval = sum (v) / length (v);
else
error ("avg: expecting vector argument");
endif
endfunction Однако в этой функции остаётся ещё одна проблема. Что произойдёт, если вызвать её без аргумента? Без дополнительной проверки ошибок Octave, вероятно, выведет сообщение об ошибке, которое не поможет найти её источник. Чтобы перехватывать такие ошибки, Octave автоматически предоставляет каждой функции переменную с именем nargin. При каждом вызове функции переменной nargin автоматически присваивается число аргументов, фактически переданных функции. Например, функцию avg можно переписать следующим образом:
function retval = avg (v)
retval = 0;
if (nargin != 1)
usage ("avg (vector)");
endif
if (isvector (v))
retval = sum (v) / length (v);
else
error ("avg: expecting vector argument");
endif
endfunction Если функции, написанные в файлах .m, вызываются с большим количеством аргументов, чем ожидалось, Octave автоматически сообщает об ошибке. Если функции передано недостаточно аргументов, Octave не сообщает об ошибке автоматически, поскольку в общем случае у функций могут быть аргументы со значениями по умолчанию. Однако любая попытка использовать переменную, которой не было присвоено значение, приведёт к ошибке. Функции могут проверять переданные им аргументы, чтобы избежать подобных проблем и выводить более конкретные сообщения об ошибках.
-
:
n =nargin() -
:
n =nargin(fcn) -
Сообщает количество входных аргументов функции.
При вызове из функции возвращает количество аргументов, переданных этой функции. На верхнем уровне возвращает количество аргументов командной строки, переданных Octave.
Если вызвана с необязательным аргументом fcn — именем или дескриптором функции, — возвращает объявленное количество аргументов, которые может принимать эта функция.
Если последний аргумент fcn — это varargin, возвращаемое значение отрицательно. Например, функция
unionдля множеств объявлена так:function [y, ia, ib] = union (a, b, varargin) and nargin ("union") ⇒ -3Примечание по программированию:
narginне работает для скомпилированных функций (файлов .oct), таких как встроенные или динамически загружаемые функции.
-
:
namestr =inputname(n) -
:
namestr =inputname(n, ids_only) -
Возвращает имя n-го аргумента вызывающей функции.
Если аргумент не является простым именем переменной, возвращает пустую строку. Примеры аргументов, для которых будет возвращена
"": числа (5.1), выражения (y/2), а также индексация ячеек или структур (c{1}илиs.field).Функция
inputnameполезна только внутри функции. При использовании в командной строке или в скрипте она всегда возвращает пустую строку.По умолчанию возвращает пустую строку, если n-й аргумент не является допустимым именем переменной. Если необязательный аргумент ids_only имеет значение false, возвращает текст аргумента, даже если он не является допустимым именем переменной. Это расширение Octave позволяет программисту точно узнать, как была вызвана функция, даже если входные данные являются сложными выражениями.
-
:
val =silent_functions() -
:
old_val =silent_functions(new_val) -
:
old_val =silent_functions(new_val, "local") -
Запрашивает или задаёт внутреннюю переменную, которая определяет, подавляется ли внутренний вывод функции.
Если этот параметр отключён, Octave будет отображать результаты вычисления выражений в теле функции, не завершающихся точкой с запятой.
При вызове из функции с параметром
"local"значение переменной локально изменяется для этой функции и всех вызываемых ею подпрограмм. При выходе из функции восстанавливается исходное значение переменной.
© 1996–2026 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.4.0/Defining-Functions.html