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 автоматически сообщает об ошибке для функций, написанных в коде файла .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/v8.1.0/Defining-Functions.html