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 и выводу сообщения ‘Доброе утро!’, за которым следует символ новой строки (символ ‘\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
Хотя Octave не сообщает об ошибке автоматически, если вы вызываете функцию с большим количеством аргументов, чем ожидалось, это, вероятно, указывает на то, что что-то не так. Octave также не сообщает об ошибке автоматически, если функция вызывается с недостаточным количеством аргументов, но любая попытка использовать переменную, которой не было присвоено значение, приведет к ошибке. Чтобы избежать таких проблем и предоставить полезные сообщения, мы проверяем оба варианта и выводим собственное сообщение об ошибке.
- nargin ()
- nargin (fcn)
-
Сообщите количество входных аргументов функции.
Вызванный внутри функции, верните количество аргументов, переданных функции. На верхнем уровне верните количество аргументов командной строки, переданных Octave.
Если вызван с необязательным аргументом fcn — имя или обработчик функции — верните объявленное количество аргументов, которые функция может принять.
Если последний аргумент fcn — varargin, возвращаемое значение отрицательное. Например, функция
unionдля множеств объявлена какfunction [y, ia, ib] = union (a, b, varargin) and nargin ("union") ⇒ -3Примечание для программистов:
narginне работает с скомпилированными функциями (.oct-файлы), такими как встроенные или динамически загруженные функции.
- inputname (n)
- inputname (n, ids_only)
-
Вернуть имя n-го аргумента вызывающей функции.
Если аргумент не является простым именем переменной, верните пустую строку. Например, ссылка на поле в структуре, такой как
s.field, не является простым именем и вернет"".inputnameполезна только внутри функции. При использовании в командной строке она всегда возвращает пустую строку.По умолчанию верните пустую строку, если n-й аргумент не является допустимым именем переменной. Если необязательный аргумент ids_only равен false, верните текст аргумента, даже если он не является допустимым именем переменной.
- val = silent_functions ()
- old_val = silent_functions (new_val)
- silent_functions (new_val, "local")
-
Запрос или установка внутренней переменной, которая управляет тем, подавляется ли внутренний вывод функции.
Если этот параметр отключен, Octave будет отображать результаты, полученные при оценке выражений внутри тела функции, которые не завершаются точкой с запятой.
Когда вызывается изнутри функции с опцией
"local", переменная изменяется локально для функции и всех вызываемых ею подпрограмм. Исходное значение переменной восстанавливается при выходе из функции.
© 1996–2022 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/v5.2.0/Defining-Functions.html