Julia 中的函数

                     

贡献者: 待更新

   本文授权转载自郝林的 《Julia 编程基础》。原文链接:第 12 章 函数与方法

12.2 Julia 中的函数

   在 Julia 中,函数实际上也属于一种值,同时也是该语言中的第一等公民(first-class citizen)。因此,它们可以被赋给变量和字段,以及作为其他函数的参数值和结果值。甚至,它们还可以是匿名的。

   Julia 中的函数的含义和作用都与数学中的定义比较贴近。你还记得定义函数的那种简洁形式吗?如:

greet() = print("Hello World!")

   这与数学中定义函数的方式是多么的相似啊!不过,这个名叫 greet 的函数并不是一个纯粹的函数。因为它有副作用,会向标准输出打印内容。

   Julia 虽然允许函数拥有副作用,但是它有一个非常好的惯用法,同时也是一项很值得遵从的编程最佳实践,那就是:拥有副作用的函数的名称会以 ! 为后缀。反过来说,名称不以 ! 为后缀的函数就不会有副作用。因此,函数名称中的 ! 也就成为了一种标志。它向我们表明了当前函数的特殊行为方式。我们在之前已经介绍过不少这样的函数,如:append!broadcast!delete!get!merge!sort!,等等。

   Julia 语言的标准库以及很多第三方库都会严格地遵循这种惯用法。不过,其中也有一些拥有副作用的函数的名称并没有以 ! 结尾,比如我们在前面提到的 print。这种函数很少,而且都是很特别的。因为它们本身就是为副作用而存在的。并且,它们在名称上往往也有着非常鲜明的示意。这才保证了使用者不会把它们与其他的没有副作用的函数相混淆,从而避免了困惑和错用。总之,这样的惯用法是非常值得借鉴的。我们也应该尽可能地遵循它们。

   另一方面,Julia 函数的用途是很广泛的。Julia 中的大多数操作符都是由函数实现的,只不过它们支持了某些特殊的语法罢了。我们在前面的章节中使用过的操作符 +-*/,以及 ===== 等等,其实都是函数。例如,在 Julia 的标准库中定义了这样一个名称为 + 的函数:

+(x::Float64, y::Float64) = add_float(x, y)

   这个函数会被应用在两个浮点数相加的操作当中:

julia> 1.2 + 2.3
3.5

julia> @which 1.2 + 2.3
+(x::Float64, y::Float64) in Base at float.jl:401

julia> +(1.2, 2.3)
3.5

julia> @which +(1.2, 2.3)
+(x::Float64, y::Float64) in Base at float.jl:401

julia>

   可以看到,不论是 1.2 + 2.3 还是 +(1.2, 2.3),它们使用的实际上都是同一种操作方式。

   除此之外,在索引表达式(如 array[1])、选择表达式(如 user.name)以及数组拼接操作背后的也都是函数。我们刚刚用到的宏 @which 可以让它们都原形毕露。

   这里需要明确一下,我们确实可以把前面那个名称为 + 的定义笼统地称为函数定义。但是,确切地说,它定义的是一个衍生方法,而且是基于泛化函数 + 的且针对于 Float64 类型的参数的衍生方法。

   你应该已经对衍生方法这个概念不陌生了。我们在前面几章中都有所提及,而且还一起编写过几个简单的衍生方法。不过,我在本章的后面还会对衍生方法进行一次系统化的阐释,以便让你能够深入地理解它们。

   下面,我们先从基本的函数编写方式讲起。


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利