学习笔记,仅供参考,有错必纠
参考自:Julia数据科学应用–Zacharias Voulgaris;官方文档
使用Julia-1.1.1
自定义函数
元祖
Julia有一个称为元组的内置数据结构,它与函数参数和返回值密切相关。元组是一个固定长度的容器,可以保存任何值,但不能被修改(它是不可变的),元组由逗号和括号组成,可以通过索引访问:
julia> (1,2+1)
(1, 3)
julia> (1,)
(1,)
julia> x = (1, "Hello", 3.14)
(1, "Hello", 3.14)
julia> x[2]
"Hello"
注意,长度为1的元组必须使用逗号(1,)来编写,因为(1)只是一个带括号的值。()表示空(长度为0)元组。
命名元祖
元组的组件可以选择命名,在这种情况下,一个命名的元组被构造:
julia> a = (x = 1, y = 2)
(x = 1, y = 2)
julia> a.y
2
除了字段可以通过名称使用点语法访问之外(x.a),命名元组与元组非常相似。
多返回值
在Julia中,返回一个元组来模拟返回多个值,可以在不需要圆括号的情况下创建和销毁元组,从而提供返回多个值而不是单个元组值的错觉,例如,下面的函数返回一对值:
julia> function h1(a, b)
a*b, a+b
end;
julia> h1(2,3)
(6, 5)
julia> x, y = h1(3, 4);
julia> x
12
julia> y
7
可变参数函数
编写带有任意数量参数的函数通常很方便,这样的函数传统上称为“varargs”函数,是“可变参数数”的缩写,我们可以在最后一个参数后面加上一个省略号来定义一个可变参数函数:
julia> h2(a, b, x...) = (a, b, x)
h2 (generic function with 1 method)
julia> h2(1, 2, 3)
(1, 2, (3,))
julia> h2(1, 2)
(1, 2, ())
julia> h2(1, 2, 4, 5)
(1, 2, (4, 5))
元祖中包含的值作为单独的参数传到函数中,要做到这点,我们需要使用省略号...
:
julia> x = (4, 5, 6)
(4, 5, 6)
julia> h2(1, 2, x)
(1, 2, ((4, 5, 6),))
julia> h2(1, 2, x...)
(1, 2, (4, 5, 6))
julia> h2(1, x...)
(1, 4, (5, 6))
julia> h2(x...)
(4, 5, (6,))
此外,插入函数调用的可迭代对象不必要是元组:
julia> x = [3, 4, 5]
3-element Array{Int64,1}:
3
4
5
julia> h2(1, 2, x...)
(1, 2, (3, 4, 5))
julia> h2(x...)
(3, 4, (5,))
Evaluation Scope of Default Values
当计算可选参数和关键字参数默认表达式时,范围内只有前面的参数,例如,给出如下定义:
function f(x, a=b, b=1)
###
end
a=b中的b指的是外部范围中的b,而不是后面的参数b。
Do-Block
将函数作为参数传递给其他函数是一种功能强大的技术,但其语法并不方便,当匿名函数需要多行时,这样的调用尤其难以编写,举一个例子:
map(x->begin
if x < 0 && iseven(x)
return 0
elseif x == 0
return 1
else
return x
end
end,
[A, B, C])
Julia提供了一个保留字do
,重写这个代码:
map([A, B, C]) do x
if x < 0 && iseven(x)
return 0
elseif x == 0
return 1
else
return x
end
end
do x
语法创建一个带有参数x
的匿名函数,并将其作为要映射的第一个参数传递。类似地,do a,b
将创建一个双参数匿名函数,而普通的do
将声明形式为()->…
的匿名函数
这些参数的初始化方式取决于“外部”函数,在这里,map将按照顺序,将x设置为A、B、C,并对每个函数调用匿名函数,正如语法映射中所发生的那样(func, [A, B, C])
这种语法使得函数有效扩展语言变得更加容易,因为调用起来就像普通的代码块,例如,do
在open
函数中的用法,确保打开的文件最终关闭:
open("outfile", "w") do io
write(io, data)
end
和其他内部函数一样,do
可以从作用域(enclosing scope)中“捕获”变量,例如,在open…do
中变量data是从外部范围捕获的。