函数定义
Julia定义函数的方式非常灵活。标准的定义方式类似于MATLAB:
|
|
Julia默认把最后一行的内容作为返回值,但如果有return
句,则会立刻返回return
语句后面的值。
此外,也可以用一行来定义简单的函数:
|
|
此外,由于Julia无缝支持各类unicode,还可以使用特殊字符:
|
|
函数的调用方法非常直接:
|
|
可以用符号::
来指定返回值类型,程序会再返回时做一个类型转换。(如果转换失败,则会报错)
|
|
如果不希望函数有返回值,那么就return nothing
,这里跟Python的return None
比较类似,return
后的nothing
是可以被省略的。值得注意的是,nothing
是一个单例。
匿名函数
在Julia中函数是一等公民,即意味着函数可以作为另一个函数的参数。
可以通过以下方式定义一个匿名函数:
|
|
匿名函数适合在map
等函数中使用。
同样,匿名函数也可以有多个参数:
|
|
函数的多个返回值
Julia使用Tuple
这一数据结构来实现返回多个值的功能。
|
|
一个tuple可以有多种数据类型。跟Python一样,元组并不需要显式地用括号括起来。
Julia还支持具名元组:
|
|
想要让一个函数返回多个值,那么就用一个元组来包含它们就好了:
|
|
Julia对元组有着类似Python的支持,比如:
|
|
暂时没看到有讲Julia支持序列解包的。
元组可以作为返回值,也可以作为函数的参数。
因为元组的存在,所以Julia支持简介的变量交换写法:
|
|
函数的参数
Julia支持变长参数:
|
|
函数bar
第三个及以后的参数会变成一个元组。
同时,Julia支持把元组中的元素逐个作为函数参数:
|
|
Julia还支持默认值参数和关键词参数:
|
|
函数的复合
在Julia中函数的复合有着非常优美的形式!
|
|
我们可以使用上面这个方式来计算函数的复合,但是为了得到复合函数的指针,我们可以使用:f ∘ g
,其中∘
符号用\circ
+<Tab>
打出。
|
|
此外,Julia还有类似shell中管道的功能,可以把一个函数的输出作为另一个函数的输入,使用符号|>
,如果要广播,那么用.|>
|
|
函数的向量化
把一个单值函数变成一个可以作用在数组上的函数,只需要在调用的时候加.
即可。(功能好比于被np.vectorize
修饰)
|
|
同样的功能也可以借助强大的Julia Macro来实现:
|
|
f.(args...)
等价于broadcast(f, args...)
,进行广播运算:
|
|
这种向量化的函数会把运算融合起来,sin.(cos.(X))
只会有一个循环,而不是先计算cos(X)
再计算sin(X)
(这样就有两重循环并且有中间变量需要存储)。
变量的作用域
Julia的函数,同其它语言一样,有自己的一个作用域。可以通过global
关键词来修改外部的作用域。
|
|