11.2 Определение функций ¶
В самом простом виде определение функции с именем имя выглядит так:
function name body endfunction
Действительное имя функции похоже на действительное имя переменной: последовательность букв, цифр и символов подчеркивания, не начинающаяся с цифры. Функции используют тот же пул имен, что и переменные.
Тело функции тело состоит из команд Octave. Это самая важная часть определения, поскольку она определяет, что должна фактически делать функция.
Например, вот функция, которая при выполнении зазвонит колокольчиком в вашем терминале (предполагая, что это возможно):
function wakeup
printf ("\a");
endfunction Команда printf (см. Ввод и вывод) просто говорит Octave напечатать строку "\a". Специальный символ ‘\a’ обозначает символ оповещения (ASCII 7). См. Строки.
После определения этой функции вы можете попросить Octave ее выполнить, набрав имя функции.
Обычно вы захотите передать информацию функциям, которые вы определяете. Синтаксис передачи параметров функции в Octave:
function name (arg-list) body endfunction
где список-аргументов — это список аргументов функции, разделенных запятыми. При вызове функции имена аргументов используются для хранения значений аргументов, заданных в вызове. Список аргументов может быть пустым, в этом случае этот вид эквивалентен представленному выше.
Чтобы напечатать сообщение вместе с звонком колокольчика, вы можете изменить 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
Символ переменная-возврата — это имя переменной, которая будет хранить возвращаемое функцией значение. Эта переменная должна быть определена перед концом тела функции для того, чтобы функция возвращала значение.
Переменные, используемые в теле функции, локальны для функции. Переменные, указанные в список-аргументов и переменная-возврата, также локальны для функции. См. Глобальные переменные, чтобы узнать, как получить доступ к глобальным переменным внутри функции.
Например, вот функция, которая вычисляет среднее значение элементов вектора:
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 автоматически сообщает об ошибке для функций, написанных в файлах с расширением .m, если они вызываются с большим количеством аргументов, чем ожидалось. 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–2023 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.2.0/Defining-Functions.html