Вообще говоря, мы все слышим о функциях или процедурах в языках программирования. Однако я только что узнал, что я использую эти термины почти взаимозаменяемо (что, вероятно, очень неправильно).
Итак, мой вопрос:
В чем разница с точки зрения их функциональности, их назначения и использования?
Пример будет оценен.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.Ответы:
Функция возвращает значение, а процедура просто выполняет команды.
Название функции происходит от математики. Он используется для расчета значения на основе ввода.
Процедура - это набор команд, которые могут быть выполнены по порядку.
В большинстве языков программирования даже функции могут иметь набор команд. Следовательно, разница только в возвращении части значения.
Но если вы хотите поддерживать чистоту функции (только взгляните на функциональные языки), вам нужно убедиться, что функция не имеет побочных эффектов.
источник
Это зависит от контекста.
В языках, подобных Паскалю, функции и процедуры являются различными объектами, различающимися в зависимости от того, возвращают они значение или нет. Они ведут себя по-разному в отношении. синтаксис языка (например, вызовы процедур в операторах формы; вы не можете использовать вызов процедуры внутри выражения, а вызовы функций не в операторах формы, вы должны использовать их в других операторах). Поэтому программисты на Паскале различают их.
В C-подобных языках и многих других современных языках это различие исчезло; в статически типизированных языках процедуры - это просто функции с забавным типом возврата. Вероятно, поэтому они используются взаимозаменяемо.
В функциональных языках обычно нет такой вещи как процедура - все является функцией.
источник
Пример в C:
Хотя вы должны заметить, что в стандарте C говорится не о процедурах, а о функциях
источник
void function
. Kernighan & Ritchie Ch 1.7: «В Си функция эквивалентна подпрограмме или функции в Фортране, или процедуре или функции в Паскале». Другими словами ... этот ответ неверен.В общем, процедура - это последовательность инструкций.
Функция может быть такой же, но обычно возвращает результат.
источник
Есть термин подпрограмма или подпрограмма которая обозначает параметризованный фрагмент кода, который можно вызывать из разных мест.
Функции и процедуры являются реализациями тех. Обычно функции возвращают значения, а процедуры ничего не возвращают.
источник
Основные отличия
Расширенные различия
В SQL:
SELECT
как DML (INSERT
,UPDATE
,DELETE
) отчетности в нем, в то время как функция позволяет толькоSELECT
заявление в нем.SELECT
операторе, тогда как функции могут быть встроены вSELECT
инструкцию.WHERE
(или aHAVING
или aSELECT
), тогда как функции могут.JOIN
блоке с другими таблицами.JOIN
блоках и других операциях Rowset.источник
Более строго, функция f подчиняется свойству f (x) = f (y), если x = y, то есть она вычисляет один и тот же результат каждый раз, когда ее вызывают с одним и тем же аргументом (и, таким образом, она не меняет состояние система) .
Таким образом, rand () или print («Hello») и т. Д. Являются не функциями, а процедурами. В то время как sqrt (2.0) должен быть функцией: не наблюдается наблюдаемого эффекта или изменения состояния, независимо от того, как часто он вызывается, и он всегда возвращает 1.41 и некоторые.
источник
Если мы не зависимы от языка, процедура обычно определяет серию действий, необходимых для надежного и идемпотентного достижения определенного результата. То есть процедура - это в основном алгоритм.
Функции, с другой стороны, являются несколько независимым фрагментом кода в более крупной программе. Другими словами, функция - это реализация процедуры.
источник
Это хорошо известный старый вопрос, но я хотел бы поделиться некоторыми соображениями о современных исследованиях и дизайне языков программирования.
Основной ответ
Традиционно (в смысле структурированного программирования ) и неформально, процедура - это многократно используемая структурная конструкция , имеющая «вход» и выполняющая что-то программируемое. Когда что-то необходимо сделать внутри процедуры, вы можете предоставить (фактические) аргументы этой процедуры в вызове процедуры, закодированном в исходном коде (обычно в виде выражения), а действия, закодированные в теле процедуры (при условии в определении процедуры) будет выполняться с подстановкой аргументов в (формальные) параметры, используемые в теле.
Функция больше , чем процедуры , поскольку возвращаемые значения также могут быть заданы как «выход» в организме. Вызовы функций более или менее идентичны вызовам процедур, за исключением того, что вы можете также использовать результат вызова функции синтаксически (обычно как подвыражение какого-либо другого выражения).
Традиционно вызовы процедур (а не вызовы функций) используются для указания того, что ни один вывод не должен интересовать, и должны быть побочные эффекты, чтобы избежать того, чтобы вызов был неиспользуемым, что подчеркивает парадигму императивного программирования . Многие традиционные языки программирования, такие как Pascal, предоставляют как «процедуры», так и «функции», чтобы различать это намеренное различие стилей.
(Для ясности, «вход» и «выход», упомянутые выше, являются упрощенными понятиями, основанными на синтаксических свойствах функций. Многие языки дополнительно поддерживают передачу аргументов в параметры посредством ссылки / совместного использования, чтобы позволить пользователям переносить информацию, закодированную в аргументах во время вызовов Такой параметр может даже называться просто «параметром in / out». Эта функция основана на природе объектов, передаваемых в вызовах, которая ортогональна свойствам функции процедуры / функции.)
Однако, если результат вызова функции не нужен, его можно просто (по крайней мере, логически) игнорировать, и определения функций / вызовы функций должны быть совместимы с определениями процедур / вызовами процедур таким образом. Подобные ALGOL языки, как C, C ++ и Java, все предоставляют функцию «функции» таким образом: кодируя тип результата
void
как особый случай функций, похожих на традиционные процедуры, нет необходимости предоставлять функцию «процедур» " по отдельности. Это предотвращает некоторое раздувание в дизайне языка.Поскольку упоминается SICP, также стоит отметить, что на языке Схемы, указанном в R n RS , процедура может или не может возвращать результат вычисления. Это объединение традиционных «функций» (возвращающих результат) и «процедур» (не возвращающих ничего), по сути, совпадающих с концепцией «функций» многих ALGOL-подобных языков (и фактически разделяющих еще больше гарантий, таких как аппликативные оценки операнды перед вызовом). Тем не менее, старомодные различия встречаются даже в нормативных документах, таких как SRFI-96 .
Я не знаю много о точных причинах расхождения, но, как я понял, кажется, что языковые дизайнеры будут счастливее без раздувания спецификаций в наши дни. То есть «процедура» как отдельная функция не нужна. Техники, подобные
void
типу, уже достаточны, чтобы обозначить использование, где следует подчеркнуть побочные эффекты. Это также более естественно для пользователей, имеющих опыт работы с C-подобными языками, которые популярны более нескольких десятилетий. Более того, это позволяет избежать затруднений в таких случаях, как R n RS, где «процедуры» фактически являются «функциями» в более широком смысле.Теоретически, функция может быть указана с указанным типом модуля в качестве типа результата вызова функции, чтобы указать, что результат является специальным. Это отличает традиционные процедуры (когда результат вызова не заинтересован) от других. Существуют разные стили в дизайне языка:
#inert
) также работает.void
Типа в Алгол-подобных языках именно пример этой техники. ISO C11_Noreturn
является аналогичным, но более тонким в этом роде.дальнейшее чтение
В соответствии с традиционной концепцией, основанной на математике, существует масса чёрной магии, о которой большинство людей не знают. Строго говоря, вы вряд ли получите ясное представление о ваших книгах по математике. Книги по CS тоже могут не сильно помочь.
Что касается языков программирования, есть несколько предостережений:
{{{}}, {}}
...), помимо некоторых ограниченных контекстов ,источник
В большинстве случаев: функция возвращает значение, а процедура - нет. Обе части кода сгруппированы вместе, чтобы сделать то же самое.
В контексте функционального программирования (где все функции возвращают значения), функция является абстрактным объектом:
Здесь f - это та же функция, что и g, но это другая процедура.
источник
Внутри процедуры мы можем использовать операторы DML (Insert / Update / Delete), но внутри функции мы не можем использовать операторы DML.
Процедура может иметь оба параметра ввода \ вывода, но функция может иметь только входной параметр.
Мы можем использовать блок Try-Catch в хранимой процедуре, но в функции Мы не можем использовать блок Try-Catch.
Мы не можем использовать хранимую процедуру в операторе Select, но в функции мы можем использовать в операторе Select.
Хранимая процедура может возвращать 0 или n значений (максимум 1024), но функция может возвращать только 1 значение, которое является обязательным.
Хранимая процедура не может быть вызвана из функции, но мы можем вызвать функцию из хранимой процедуры.
Мы можем использовать транзакцию в хранимой процедуре, но в функции мы не можем использовать транзакцию.
Мы не можем использовать хранимую процедуру в выражении Sql где-либо в разделе Где / Имеем / выберите, но в функции, которую мы можем использовать.
Мы не можем присоединиться к хранимой процедуре, но мы можем присоединиться к функции.
для получения дополнительной информации нажмите здесь ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html
источник
Функция возвращает значение, а процедура просто выполняет команды.
Название функции происходит от математики. Он используется для расчета значения на основе ввода.
Процедура - это набор команд, которые могут быть выполнены по порядку.
В большинстве языков программирования даже функции могут иметь набор команд. Следовательно, разница только в возвращении части значения.
Но если вы хотите поддерживать чистоту функции (только взгляните на функциональные языки), вам нужно убедиться, что функция не имеет побочных эффектов.
источник
Функцию можно использовать внутри оператора SQL, тогда как процедуру нельзя использовать в операторе SQL.
Операторы Insert, Update и Create не могут быть включены в функцию, но процедура может иметь эти операторы.
Процедура поддерживает транзакции, но функции не поддерживают транзакции.
Функция должна возвращать одно и только одно значение (другое может быть возвращено переменной OUT), но процедура возвращает столько наборов данных и возвращаемых значений.
Планы выполнения функций и процедур кэшируются, поэтому производительность в обоих случаях одинакова.
источник
Я возражаю против чего-то, что я вижу в большинстве этих ответов снова и снова, что функция превращается в функцию в том, что она возвращает значение.
Функция - это не просто старый метод, который возвращает значение. Не так: чтобы метод был реальной функцией, он должен возвращать одно и то же значение, всегда учитывая конкретный вход. Примером метода, который не является функцией, является
random
метод в большинстве языков, потому что, хотя он и возвращает значение, значение не всегда одинаково.Поэтому функция больше похожа на карту (например, где
x -> x'
для одномерной функции). Это очень важное различие между обычными методами и функциями, потому что при работе с реальными функциями время и порядок, в котором они оцениваются, никогда не должны иметь значения, поскольку это не всегда имеет место с не функциями.Вот еще один пример метода, который не является функцией, но все равно будет возвращать значение.
Я также возражаю против того, что процедуры не возвращают значений. Процедура - это просто особый способ говорить о функции или методе. Таким образом, это означает, что если базовый метод, который ваша процедура определяет или реализует, возвращает значение, то угадайте, что эта процедура возвращает значение. Возьмите, например, следующий фрагмент из SICP :
Вы много слышали о рекурсивных процедурах в последнее время? Они говорят о рекурсивной функции (реальной функции), и она возвращает значение, и они используют слово «процедура». Так в чем же разница?
Ну и еще один способ мышления функции (помимо значения, упомянутого выше) - это абстрактное представление идеала, подобного цифре 1. Процедура - это фактическая реализация этой вещи. Я лично думаю, что они взаимозаменяемы.
(Обратите внимание, что если вы прочитаете эту главу по ссылке, которую я предоставляю, вы можете обнаружить, что более сложная концепция - это не разница между функцией и процедурой, а процесс и процедура. Знаете ли вы, что рекурсивная процедура может иметь итерационный процесс?)
Аналогом для процедур являются рецепты. Например; Предположим, у вас есть машина, которая называется
make-pies
эта машина принимает ингредиенты,(fruit, milk, flower, eggs, sugar, heat)
и эта машина возвращает аpie
.Представление этой машины может выглядеть так
Конечно, это не единственный способ сделать пирог.
В этом случае мы можем видеть, что:
Эта аналогия в порядке, но она нарушается, если учесть, что когда вы имеете дело с компьютерной программой, все является абстракцией. Таким образом, в отличие от рецепта машины, мы сравниваем две вещи, которые сами являются абстракцией; две вещи, которые могут быть одинаковыми. И я считаю, что они (для всех намерений и целей) одно и то же.
источник
В контексте db : Хранимая процедура - это предварительно скомпилированный план выполнения, в котором функции отсутствуют.
источник
В терминах С # / Java функция - это блок кода, который возвращает определенное значение, а процедура - это блок кода, который возвращает void (ничего). В C # / Java и функции, и процедуры чаще называют просто методами .
источник
Процедуры: 1.Процедуры - это наборы операторов, которые определяют параметризованные вычисления. 2.Процедуры не могут возвращать значения.
3.Процедуры не могут быть вызваны из функции.
Функции 1. Функции структурно напоминают процедуры, но они семантически смоделированы на математических функциях. 2. Он может возвращать значения. 3. Функция может быть вызвана из процедур.
источник
Обе процедуры и функции являются обеими подпрограммами, единственное различие между ними состоит в том, что процедура возвращает несколько (или, по крайней мере, может делать) значений, тогда как функция может возвращать только одно значение (именно поэтому обозначения функций используются в математических выражениях, поскольку обычно найдено только одно значение в одно время), хотя некоторые языки программирования не следуют этим правилам, это их истинные определения
источник
return
. Вы говорите о побочных эффектах, которые возможны с обоими (если это разрешено языком).