贡献者: 待更新
本文授权转载自郝林的 《Julia 编程基础》。原文链接:第 12 章 函数与方法。
在数学中,函数指的是两个非空集合之间的一种对应关系。例如,有这样一个函数:
f(x) = x + x
对此,我们输入 1
就一定会得到 2
,输入 2
就一定会得到 4
,输入 3
就一定会得到 6
,等等。
只要我们给予一个函数的输入值是确定的,那么它的输出值就一定也是确定的。即使我们还不知道那个输出值是什么,也是如此。所以,在使用者看来,函数就像一个黑箱。只要我们给予它一个或一组参数,它就会为我们返回一个结果。如果我们想要知道一个函数具体都做了些什么,就只能去查看和理解它的内在了。
另外,数学中的函数还有着如下特性(或者说规则):
f(x,y) = x + y
这个函数。
显然,数学中的函数定义是非常严谨的。它可以保证每一个函数的有效性和稳定性。相比之下,程序设计领域对于函数这一概念的诠释就比较丰富多彩了。这主要是因为,各种编程语言都会结合自身的特点来确定 “函数” 的地位、用途以及功能。
比如,在一些崇尚函数式编程(functional programming)的编程语言中,尤其是那些纯粹的函数式编程语言,其函数的定义方式就非常贴近于数学中的函数。而在一些混合式的编程语言中,函数的定义可以是非常灵活的。这些函数可以有自己的副作用(side effects),甚至可以没有输出值以及输入值。此外,一些倡导面向对象编程(object oriented programming)的编程语言会弱化函数这个概念。在这种程序中的所谓函数只能被定义成对象或者类型的附属品,而不能独立的存在。
我在这里再解释一下刚刚提到的一些概念。它们对于你来说可能会比较陌生。函数的副作用是指,除了返回输出值之外,函数对外界产生的其他影响。比如,修改传入的参数值、修改某个全局的变量或状态(同时也可能会受到其影响)、向计算机的标准输出(也就是 stdout)打印内容,等等。拥有副作用的函数肯定就不能被称为纯粹的函数了。但是,在很多时候这种函数的存在也是很有必要的。另外,函数式、混合式和面向对象指的都是编程语言所支持的编程范式(programming paradigm)。其中,混合式的意思是,编程语言对函数式、面向对象甚至其他的编程范式都提供了一定程度上的支持。这样的编程语言也常常被称为多范式语言。
我早在第一章就说过,Julia 是多范式的编程语言。而且,它是明显倾向于函数式的。函数在 Julia 语言中绝对有着举足轻重的作用和地位。这也是我之前一直在陆续地讲述 Julia 函数相关知识的主要原因。