В чем разница между "функцией" и "процедурой"?

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

Итак, мой вопрос:

в чем разница с точки зрения их функциональности, их назначения и использования?

пример был бы признателен.

17 ответов


функция возвращает значение, а процедура просто выполняет команды.

функция name происходит от math. Он используется для вычисления значения на основе входных данных.

процедура-это набор команд, которые могут быть выполнены по порядку.

в большинстве языков программирования, даже функции могут иметь набор команд. Следовательно, разница заключается только в возврате части значения.

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


Это зависит от контекста.

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

В C-подобных языки и многие другие современные языки это различие исчезло; в статически типизированных языках процедуры-это просто функции со смешным типом возврата. Вероятно, поэтому они взаимозаменяемы.

в функциональных языках обычно нет такой вещи, как процедура - все это функция.


например, в C:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

хотя вы должны отметить, что стандарт C не говорит о процедурах, только о функциях.


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


есть термин подпрограмма или подпрограмма что означает параметризованный фрагмент кода, который можно вызвать из разных мест.

функции и процедуры реализации этих. Обычно функции возвращают значения, а процедуры ничего не возвращают.


Основные Различия

  • функция должна возвращать значение, но в хранимых процедурах это необязательно: процедура может возвращать 0 или n значения.
  • функции могут иметь только входные параметры для него, тогда как процедуры могут иметь входные / выходные параметры.
  • для функции обязательно принимать один входной параметр, но хранимая процедура может принимать от 0 до n параметры ввода.
  • функции могут быть вызывается из процедуры, тогда как процедуры не могут быть вызваны из функции.

Дополнительные Различия

  • исключения могут обрабатываться блоками try-catch в процедуре, тогда как блок try-catch не может использоваться в функции.
  • мы можем перейти на управление транзакциями в процедуре, тогда как в функции мы не можем.

в SQL:

  • процедура позволяет SELECT а также DML (INSERT, UPDATE, DELETE) операторы в нем, тогда как функция позволяет только SELECT заявление в ней.
  • процедуры не могут быть использованы в режиме SELECT оператор, тогда как функции могут быть встроены в SELECT заявление.
  • хранимые процедуры не могут использоваться в операторах SQL в любом месте WHERE (или HAVING или SELECT) блок, тогда как функции могут.
  • функции, возвращающие таблицы, можно рассматривать как другой набор строк. Это можно использовать в JOIN блок с другими столами.
  • встроенные функции можно рассматривать как представления, которые принимают параметры и может использоваться в JOIN блоки и другие операции набора.

строго говоря, функция f подчиняется свойству, что f(x) = f (y), если x = y, т. е. вычисляет тот же результат каждый раз он вызывается с одним и тем же аргументом (и, таким образом, он не изменяет состояние системы.)

таким образом, rand() или print("Hello") и т. д. не функции, а процедуры. В то время как sqrt(2.0) должен быть функцией: нет наблюдаемого эффекта или изменения состояния независимо от того, как часто его называют, и он всегда возвращает 1.41 и некоторые.


внутри процедуры мы можем использовать операторы DML (Insert /Update/Delete), но внутри функции мы не можем использовать операторы DML.

процедура может иметь оба входных\выходных параметра, но функция может иметь только входной параметр.

мы можем использовать блок Try-Catch в хранимой процедуре, но в функции мы не можем использовать блок Try-Catch.

мы не можем использовать хранимую процедуру в инструкции Select, но в функции мы можем использовать в инструкции Select.

сохраненные Процедура может возвращать 0 или n значений (максимум 1024), но функция может возвращать только 1 обязательное значение.

хранимая процедура не может быть вызовом из функции, но мы можем вызвать функцию из хранимой процедуры.

мы можем использовать транзакцию в хранимой процедуре, но в функции мы не можем использовать транзакцию.

мы не можем использовать хранимую процедуру в инструкции Sql в любом месте в разделе Where/Having/select, но в функции мы можем использовать.

мы не можем присоединиться Хранимая процедура, но мы можем присоединиться к функции.

дополнительные.. щелчок here...http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


в большинстве случаев: функция возвращает значение, а процедура нет. Оба куска кода сгруппированы вместе, чтобы сделать то же самое.

в контексте функционального программирования (где все функции возвращают значения), функция является абстрактным объектом:

f(x)=(1+x)
g(x)=.5*(2+x/2)

здесь f-та же функция, что и g, но это другая процедура.


Если мы здесь языковые агностики,процедура обычно указывает ряд действий, необходимых для надежного и идемпотентного достижения определенного результата. То есть процедура-это в основном алгоритм.

Functions, с другой стороны, является несколько независимым фрагментом кода в более крупной программе. Другими словами, функция-это реализация процедуры.


функция возвращает значение, а процедура просто выполняет команды.

функция name происходит от math. Он используется для вычисления значения на основе входных данных.

процедура-это набор команд, которые могут быть выполнены по порядку.

в большинстве языков программирования, даже функции могут иметь набор команд. Следовательно, разница заключается только в возврате части значения.

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


функция может использоваться в инструкции sql, тогда как процедура не может использоваться в инструкции sql.

инструкции Insert, Update и Create не могут быть включены в функцию, но процедура может иметь эти операторы.

процедура поддерживает транзакции, но функции не поддерживают транзакции.

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

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


Я возражаю с чем-то, что я продолжаю видеть снова и снова в большинстве этих ответов, что делает функцию функцией, что она возвращает значение.

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

функция больше похожа на карту (например, где x -> x' для одномерной функции). Это очень важное различие между регулярными методами и функциями, потому что при работе с реальными функциями время и порядок, в котором они оцениваются, никогда не должны иметь значения, где, поскольку это не всегда так с не функциями.

вот еще один пример метода, который не является функцией, но в противном случае будет возвращать значение.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Я также возражаю против того, что процедуры не возвращают значения. Процедура-это просто определенный способ говорить о функции или метода. Это означает, что если базовый метод, который определяет или реализует ваша процедура, возвращает значение, угадайте, что эта процедура возвращает значение. Возьмем для примера следующий фрагмент SICP:

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

вы много слышали о рекурсивных процедурах в последнее время? Они говорят о рекурсивной функции (реальной функции), и она возвращает значение, и они используют слово "процедура". Тогда какая разница?

другой способ мышления функции (помимо упомянутого выше значения) - это абстрактное представление идеала, такого как число 1. Процедура - это фактическое осуществление этой вещи. Лично я считаю, что они взаимозаменяемы.

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

аналогом для процедур являются рецепты. Например, предположим, у вас есть машина под названием make-pies эта машина принимает ингредиенты (fruit, milk, flower, eggs, sugar, heat) и эта машина возвращает pie.

представление этой машины может выглядеть как

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

конечно, это не единственный способ сделать пирог.

в этом случае мы видим, что:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

эта аналогия в порядке, но она ломается, когда вы принимаете во внимание, что когда вы имеете дело с компьютерной программой, все является абстракцией. В отличие от рецепта и машины, мы сравниваем две вещи, которые сами по себе являются абстракциями; две вещи, которые с таким же успехом могут быть одной и той же вещью. И я держу это. они (для всех намерений и целей) одно и то же.


в контексте db: Хранимая процедура предкомпилированного план выполнения, где as функций нет.


в терминах С# / Java,функции - это блок кода, который возвращает определенное значение, но процедура - это блок кода, который возвращает пустота (ничего). В C# / Java обе функции и процедуры чаще всего называются просто методы.

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

порядок: 1.Процедуры-это коллекции операторов, которые определяют параметризованные вычисления. 2.Процедуры не могут возвращать значения.

3.Процедуры нельзя вызывать из функции.

функции 1.Функции структурно напоминают процедуры, но семантически моделируются на математических функциях. 2.Он может возвращать значения 3.Функцию можно вызвать из процедур.


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