Функция (программирование): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
исправил ошибку в примере на Nim
м автоматическая отмена правки участника 5.228.83.135 - R:5B ORES: 0.8565
Метка: откат
 
(не показано 27 промежуточных версий 17 участников)
Строка 3: Строка 3:
'''Фу́нкция''' в [[Программирование|программировании]], или [[подпрограмма]] — фрагмент программного кода, к которому можно обратиться из другого места [[Компьютерная программа|программы]]. В большинстве случаев с функцией {{iw|Связывание имён|связывается идентификатор|en|Name binding}}, но многие языки допускают и [[анонимная функция|безымянные функции]]. С именем функции неразрывно связан адрес первой инструкции ([[Оператор (программирование)|оператора]]), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была вызвана.
'''Фу́нкция''' в [[Программирование|программировании]], или [[подпрограмма]] — фрагмент программного кода, к которому можно обратиться из другого места [[Компьютерная программа|программы]]. В большинстве случаев с функцией {{iw|Связывание имён|связывается идентификатор|en|Name binding}}, но многие языки допускают и [[анонимная функция|безымянные функции]]. С именем функции неразрывно связан адрес первой инструкции ([[Оператор (программирование)|оператора]]), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была вызвана.


Функция может принимать параметры и должна возвращать некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют '''[[Процедура (программирование)|процедурами]]'''. В некоторых языках программирования объявления функций и процедур имеют различный синтаксис, в частности, могут использоваться различные ключевые слова.
Функция может принимать параметры и должна возвращать некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют [[Процедура (программирование)|процедурами]]. В некоторых языках программирования объявления функций и процедур имеют различный синтаксис, в частности, могут использоваться различные ключевые слова.


Функция должна быть соответствующим образом ''объявлена'' и ''определена''. ''Объявление функции'', кроме имени, содержит список имён и [[Тип данных|типов]] передаваемых ''[[Параметр (программирование)|параметров]]'' (или: ''[[Аргумент (программирование)|аргументов]]''), а также, тип возвращаемого функцией значения. ''Определение'' функции содержит исполняемый код функции. В одних языках программирования объявление функции непосредственно предваряет определение функции, в то время как в ряде других языков необходимо сначала объявить функцию, а уже потом привести её определение. <!-- я не почувствовал разницы: можно яснее сформулировать альтернативу? ~~~~ -->
Функция должна быть соответствующим образом ''объявлена'' и ''определена''. ''Объявление функции'', кроме имени, содержит список имён и [[Тип данных|типов]] передаваемых ''[[Параметр (программирование)|параметров]]'' (или: ''[[Аргумент (программирование)|аргументов]]''), а также, тип возвращаемого функцией значения. ''Определение'' функции содержит исполняемый код функции. В одних языках программирования объявление функции непосредственно предваряет определение функции, в то время как в ряде других языков необходимо сначала объявить функцию, а уже потом привести её определение. <!-- я не почувствовал разницы: можно яснее сформулировать альтернативу? ~~~~ -->


В [[Объектно-ориентированное программирование|объектно-ориентированном программировании]] функции, объявления которых являются неотъемлемой частью определения [[Класс (программирование)|класса]], называются ''[[Метод (программирование)|методами]]''. Также в языках с [[Объектно-ориентированное программирование|ООП]] возможно объявление [[Виртуальная функция|абстрактной(виртуальной) функции]] без объявления тела функции.
В [[Объектно-ориентированное программирование|объектно-ориентированном программировании]] функции, объявления которых являются неотъемлемой частью определения [[Класс (программирование)|класса]], называются [[Метод (программирование)|методами]]. Также в языках с [[Объектно-ориентированное программирование|ООП]] возможно объявление [[Виртуальная функция|абстрактной (виртуальной) функции]] без объявления тела функции.


Для того, чтобы использовать ранее определённую функцию, необходимо в требуемом месте программного кода указать имя функции и перечислить передаваемые в функцию параметры. Параметры, которые передаются функции, могут передаваться как по значению, так и по ссылке: для переменной, переданной по значению создаётся локальная копия и любые изменения, которые происходят в теле функции с переданной переменной, на самом деле, происходят с локальной копией и никак не сказываются на самой переменной, в то время как изменения, которые происходят в теле функции с переменной, переданной по ссылке, происходят с самой переданной переменной.
Для того, чтобы использовать ранее определённую функцию, необходимо в требуемом месте программного кода указать имя функции и перечислить передаваемые в функцию параметры. Параметры, которые передаются функции, могут передаваться как по значению, так и по ссылке: для переменной, переданной по значению создаётся локальная копия и любые изменения, которые происходят в теле функции с переданной переменной, на самом деле, происходят с локальной копией и никак не сказываются на самой переменной, в то время как изменения, которые происходят в теле функции с переменной, переданной по ссылке, происходят с самой переданной переменной.
Строка 13: Строка 13:
Функция определяет собственную (локальную) область видимости, куда входят входные параметры, а также те переменные, которые объявляются непосредственно в теле самой функции.
Функция определяет собственную (локальную) область видимости, куда входят входные параметры, а также те переменные, которые объявляются непосредственно в теле самой функции.


Существует возможность вызвать функцию внутри самой функции: такой вызов функции называется ''рекурсивным'', а сам процесс последовательных вложенных друг в друга вызовов функций называют [[Рекурсия|рекурсией]]. Поскольку необходимо запомнить (в стеке) адрес возврата функции (а, также, выделить в том же стеке память под параметры и локальные переменные, не являющиеся динамическими), то ничем не ограниченная рекурсия приводит к [[Переполнение стека|переполнению стека]], поэтому в [[Язык программирования|языках программирования]] устанавливается некоторый предельный уровень вложенности рекурсивных вызовов.
Существует возможность вызвать функцию внутри самой функции: такой вызов функции называется ''рекурсивным'', а сам процесс последовательных вложенных друг в друга вызовов функций называют [[Рекурсия|рекурсией]]. Поскольку необходимо запомнить (в стеке) адрес возврата функции (а также, выделить в том же стеке память под параметры и локальные переменные, не являющиеся динамическими), то ничем не ограниченная рекурсия приводит к [[Переполнение стека|переполнению стека]], поэтому в [[Язык программирования|языках программирования]] устанавливается некоторый предельный уровень вложенности рекурсивных вызовов.


== Примеры функций ==
== Примеры функций ==
Строка 19: Строка 19:
=== JavaScript ===
=== JavaScript ===
<source lang="javascript">
<source lang="javascript">
function max(a, b) {
function sum(a, b) {
return a > b ? a : b;
return a + b
}
}
</source>
</source>
Строка 33: Строка 33:
</source>
</source>


=== С++ ===
=== C++ ===
<source lang="cpp">
<source lang="cpp">
void name(string text)
void name(string text)
Строка 40: Строка 40:
}
}
</source>в стандарте C++ существуют так же функции с аргументами по умолчанию<syntaxhighlight lang="c++">
</source>в стандарте C++ существуют так же функции с аргументами по умолчанию<syntaxhighlight lang="c++">
void foo(int arg1, int arg2 = 10){
void foo(int arg1, int arg2 = 10)
{
cout << arg1 << arg2;
cout << arg1 << arg2;
}
}


foo(9); // вызовется и будет выведено 910
foo(9); // вызовется и будет выведено 910
</syntaxhighlight>

=== Ruby ===
<syntaxhighlight lang="ruby">
def greetings(name)
puts "Hi #{name}"
end

greetings('Ksenia') #Hi Ksenia
</syntaxhighlight>
</syntaxhighlight>


Строка 54: Строка 64:
T: PartialOrd,
T: PartialOrd,
{
{
if a > b {
if a > b
{
a
a
} else {
}
else
{
b
b
}
}
Строка 68: Строка 81:
public void Name(string text)
public void Name(string text)
{
{
System.Console.WriteLine(text);
Console.WriteLine(text);
}
}
</source>
</source>


=== Java ===
=== Java ===
<syntaxhighlight lang="java">
<syntaxhighlight lang="java" line="1">
public void name(String text) {
public void name(String text) {
System.out.println(text);
System.out.println(text);
Строка 106: Строка 119:
=== Swift ===
=== Swift ===
<syntaxhighlight lang="swift">
<syntaxhighlight lang="swift">
func foo(arg1: Int, arg2: Int = 10) {
func foo(arg1: Int, arg2: Int = 10)
{
print(arg1 * arg2)
print(arg1 * arg2)
}
}
Строка 129: Строка 143:
=== Python ===
=== Python ===
<source lang="python3">
<source lang="python3">
def func(p):
def func(p1: str, p2: int = 10):
print(p)
print(p1, p2)
func(123) # 123 10
</source>
</source>



Текущая версия от 13:35, 5 июля 2024

Фу́нкция в программировании, или подпрограмма — фрагмент программного кода, к которому можно обратиться из другого места программы. В большинстве случаев с функцией связывается идентификатор[англ.], но многие языки допускают и безымянные функции. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была вызвана.

Функция может принимать параметры и должна возвращать некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют процедурами. В некоторых языках программирования объявления функций и процедур имеют различный синтаксис, в частности, могут использоваться различные ключевые слова.

Функция должна быть соответствующим образом объявлена и определена. Объявление функции, кроме имени, содержит список имён и типов передаваемых параметров (или: аргументов), а также, тип возвращаемого функцией значения. Определение функции содержит исполняемый код функции. В одних языках программирования объявление функции непосредственно предваряет определение функции, в то время как в ряде других языков необходимо сначала объявить функцию, а уже потом привести её определение.

В объектно-ориентированном программировании функции, объявления которых являются неотъемлемой частью определения класса, называются методами. Также в языках с ООП возможно объявление абстрактной (виртуальной) функции без объявления тела функции.

Для того, чтобы использовать ранее определённую функцию, необходимо в требуемом месте программного кода указать имя функции и перечислить передаваемые в функцию параметры. Параметры, которые передаются функции, могут передаваться как по значению, так и по ссылке: для переменной, переданной по значению создаётся локальная копия и любые изменения, которые происходят в теле функции с переданной переменной, на самом деле, происходят с локальной копией и никак не сказываются на самой переменной, в то время как изменения, которые происходят в теле функции с переменной, переданной по ссылке, происходят с самой переданной переменной.

Функция определяет собственную (локальную) область видимости, куда входят входные параметры, а также те переменные, которые объявляются непосредственно в теле самой функции.

Существует возможность вызвать функцию внутри самой функции: такой вызов функции называется рекурсивным, а сам процесс последовательных вложенных друг в друга вызовов функций называют рекурсией. Поскольку необходимо запомнить (в стеке) адрес возврата функции (а также, выделить в том же стеке память под параметры и локальные переменные, не являющиеся динамическими), то ничем не ограниченная рекурсия приводит к переполнению стека, поэтому в языках программирования устанавливается некоторый предельный уровень вложенности рекурсивных вызовов.

Примеры функций

[править | править код]
function sum(a, b) {
  return a + b
}
public function name(text: string) 
{
        var textfield: TextField = new TextField();
        textfield.text = text;
}
void name(string text)
{
    cout << text;
}

в стандарте C++ существуют так же функции с аргументами по умолчанию

void foo(int arg1, int arg2 = 10)
{
	cout << arg1 << arg2;
}

foo(9); // вызовется и будет выведено 910
def greetings(name)
    puts "Hi #{name}"
end

greetings('Ksenia') #Hi Ksenia
#[inline(always)]
fn max<T>(a: T, b: T) -> T
where
    T: PartialOrd,
{
    if a > b 
    {
        a
    }
    else 
    {
        b
    }
}

max(3, 5);
public void Name(string text)
{
    Console.WriteLine(text);
}
public void name(String text) {
    System.out.println(text);
}
procedure name(var text: string)
begin
  write(text);
end;
function name($text)
{
    echo $text;
}
fun name t = print t

или, что то же самое (см. функции первого класса и лямбда-функция):

val name = fn t => print t
func foo(arg1: Int, arg2: Int = 10) 
{
    print(arg1 * arg2)
}

foo(arg1: 9) // (9 * 10) Ответ: 90
Sub Name(text)
    Console.WriteLine(text)
End Sub
Procedure.l Name(text.s)
    PrintN(text)
EndProcedure
def func(p1: str, p2: int = 10):
    print(p1, p2)
func(123)  # 123 10
proc myfunc(text: string)=
  echo text