“function”和“程序”有什么区别?

一般来说,我们都听说了编程语言的function程序 。 但是,我发现我几乎可以互换地使用这些术语(这可能是非常错误的)。

所以,我的问题是:

它们的function,目的和用途有什么不同?

一个例子,将不胜感激。

一个函数返回一个值,一个过程只是执行命令。

名字函数来自math。 它用于根据input计算一个值。

一个过程是一组可以按顺序执行的命令。

在大多数编程语言中,偶函数可以有一组命令。 所以区别只在于返回值部分。

但是如果你想保持一个函数的干净,(只要看function语言),你需要确保一个函数没有副作用。

这取决于上下文。

在类似Pascal的语言中,函数和过程是不同的实体,不同的是它们是否返回值。 他们的行为不同。 语言语法(例如,过程调用表单语句;不能在expression式中使用过程调用,而函数调用不能形成语句,您必须在其他语句中使用它们)。 因此,帕斯卡尔编程的程序员区分这些。

在类似C语言以及其他许多当代语言中,这种区别已经消失, 在静态types的语言中,过程只是一个有趣的返回types的函数。 这可能是为什么它们可以互换使用。

在函数式语言中,通常没有程序这样的东西 – 一切都是一个函数。

C中的示例:

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

虽然你应该注意到C标准并不谈论程序,只是函数。

通常,程序是一系列指令。
一个函数可以是相同的,但通常返回一个结果。

有一个术语子程序子程序 ,代表可以从不同地方调用的参数化代码片段。

函数和过程是这些的实现。 通常函数返回值和过程不返回任何东西。

更严格地说,一个函数f服从f(x)= f(y)如果x = y的属性,也就是说,每次用相同的参数调用它时计算相同的结果 (因此它不会改变系统。)

因此,rand()或print(“Hello”)等不是函数,而是过程。 虽然sqrt(2.0)应该是一个函数:不pipe被调用的频率如何,它都没有可观察到的效果或状态变化,并且它总是返回1.41和一些。

在内部程序中我们可以使用DML(Insert / Update / Delete)语句,但是Inside函数我们不能使用DML语句。

程序可以同时具有input\输出参数,但函数只能有input参数。

我们可以在存储过程中使用TryCatch块,但是在函数中我们不能使用TryCatch块。

我们不能在Select语句中使用存储过程,但是在函数中我们可以在Select语句中使用。

存储过程可以返回0或n个值(最大1024),但函数只能返回1个必须的值。

存储过程不能从函数调用,但可以从存储过程调用函数。

我们可以在存储过程中使用事务,但是在函数中我们不能使用事务。

我们不能在Where / Having / select部分的任何地方的Sql语句中使用Stored Procedure,但是在函数中我们可以使用。

我们不能join存储过程,但是我们可以join函数。

为更多..点击这里… http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html

基本差异

  • 函数必须返回一个值,但在“存储过程”中是可选的:过程可以返回0或n个值。
  • 函数只能有input参数,而程序可以有input/输出参数。
  • 对于一个函数来说,只需要一个input参数,但是一个存储过程可能需要0到n个input参数。
  • 函数可以从程序调用,而程序不能从函数调用。

高级差异

  • exception可以通过一个过程中的try-catch块来处理,而一个try-catch块不能在一个Function中使用。
  • 我们可以在一个过程中进行事务pipe理,而在一个函数中,我们不能。

在SQL中:

  • 一个过程允许SELECT以及DML( INSERTUPDATEDELETE )语句,而Function只允许SELECT语句。
  • 过程不能在SELECT语句中使用,而函数可以embedded在SELECT语句中。
  • 存储过程不能在WHERE (或HAVINGSELECT )块中的任何位置的SQL语句中使用,而函数可以。
  • 返回表的函数可以被视为另一个Rowset。 这可以在与其他表的JOIN块中使用。
  • 内联函数可以被认为是带参数的视图,可以用在JOIN块和其他Rowset操作中。

在大多数情况下:一个函数返回一个值,而一个过程不会。 两者都是编码在一起做同样的事情。

在函数式编程上下文中(所有函数都返回值),函数是一个抽象对象:

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

在这里,f是和g相同的函数,但是是一个不同的过程。

如果我们在这里是语言不可知的,那么程序通常会指定一系列需要可靠而有意识地达到某些结果的行为。 也就是说,一个程序基本上是一个algorithm。

另一方面,函数是一个较大的程序中的一段独立的代码。 换句话说,function就是执行一个程序。

一个函数返回一个值,一个过程只是执行命令。

名字函数来自math。 它用于根据input计算一个值。

一个过程是一组可以按顺序执行的命令。

在大多数编程语言中,偶函数可以有一组命令。 所以区别只在于返回值部分。

但是如果你想保持一个函数的干净,(只要看function语言),你需要确保一个函数没有副作用。

函数可以在sql语句中使用,而过程不能在sql语句中使用。

插入,更新和创build语句不能包含在函数中,但过程可以包含这些语句。

程序支持事务,但函数不支持事务。

函数必须返回一个且只有一个值(另一个可以由OUTvariables返回),但是过程返回尽可能多的数据集和返回值。

caching这两个函数和过程的执行计划,所以在这两种情况下的性能是相同的。

我反驳了大多数这些答案中反复提及的东西,使得函数成为函数的是它返回一个值。

一个函数不只是返回一个值的旧方法。 不是这样的:为了让一个方法成为一个真正的函数,它必须在给定的input时总是返回相同的值。 不是函数的方法的一个例子是大多数语言中的random方法,因为尽pipe返回值的值并不总是相同的。

因此函数更类似于地图(例如,对于一维函数,其中x -> x' )。 这是常规方法和function之间的一个非常重要的区别,因为在处理实际function时,它们的评估时间和顺序决不会影响,因为非function情况并非总是如此。

这是另一个不是函数的方法的例子,否则将返回一个值。

 // 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)))))) 

你最近有没有听说过recursion程序? 他们正在讨论一个recursion函数(一个真正的函数),它正在返回一个值,他们正在使用“procedure”这个词。 那么有什么区别?

那么另一种思考函数的方法(除了上面提到的含义之外)就像是数字1的理想的抽象表示。一个过程就是那个事物的实际执行。 我个人认为它们是可以互换的。

(请注意,如果您从我提供的链接中阅读该章节,您可能会发现一个更难掌握的概念并不是函数和过程之间的区别,而是过程和过程。您是否知道recursion过程可以具有迭代过程?)

程序的一个类比是食谱。 例如; 假设你有一台叫做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的上下文中:存储过程是预编译的执行计划,其中函数不是。

就С#/ Java而言, 函数是代码块,它返回特定的值,但是过程是返回void (无)的代码块。 在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.程序不能从函数调用。

function 1.function在结构上类似于程序,但在mathfunction上进行语义build模。 2.可以返回值3.function可以从程序中调用。

过程和函数都是子例程,它们之间的唯一区别是过程返回多个 (或至less可以)值,而函数只能返回一个值(这就是为什么函数表示法在math中被使用,因为通常只有一个值被find虽然有些编程语言不遵循这些规则,但这是它们的真正定义