Julia匿名函数
在函数作为参数或返回值时,如果定义体较为简单,可以不用预先定义该函数,而采用更为简单、直接的匿名函数。匿名函数不需要函数名,只需提供参数需求及实现体即可。其定义的基本语法为:
function (参数表)
# 实现体
end
或者采用另外一种更为常用的方式,即:
(参数表) -> 复合表达式
其中,符号->
用于连接函数参数与实现体部分。在后一种简单的方式中,如果参数只有一个,圆括号可以省略;但无参数或多于一个参数时,圆括号不可省略。
下面是一些匿名函数的例子:
从成功信息看,与前面介绍的普通非匿名函数相同,都是“generic function”的一种。而且在定义后,Julia内部会自动给予该匿名函数一个编号。
不过需要留意匿名函数与常规表达式的区别,它们在本质上是不同的。表达式是一个可执行的操作,而匿名函数则是建立了参数表到表达式的映射。
在需要函数作为参数时,如果是简短的实现便无须先定义再使用,而是在调用处直接提供匿名函数。例如:
julia> function g(f, x, y, z)
f(x, y, z)
end
g (generic function with 1 methods)
julia> g( (x, y, z) -> x * y + z, 2, 3, 4) # 首个参数为函数
10 # 即2*3+4
julia> function h(f::Function)
f()
end
h (generic function with 2 methods)
julia> h( () -> 10 + 2 ) # 无参的匿名函数,直接返回两个值的累加和
12
此外,匿名函数作为返回值也极为简单,只需将其作为函数体内部的最后一个表达式即可,或使用return返回也可以。例如:
julia> function f1()
x -> x^2 + 2x -1
end
f1 (generic function with 1 method)
julia> function f2()
return (x, y) -> x + y
end
f2 (generic function with 1 methods)
julia> f1()(2)
7
julia> f2()(2, 3)
5
事实上,匿名函数除了没有名字之外,其他的语法均遵循普通函数的定义规则,例如可进行类型限定,使用默认值、可变参数或键值参数等,这里不再赘述。
但较长的匿名函数直接以实现体作为参数时,会使代码变得极难阅读,也不利于维护。为解决该问题,Julia提供了do代码块的语法,能够在调用时以独立的结构实现匿名函数,基本表述方式为:
调用函数名(实参表) do匿名函数参变量表
# 匿名函数实现体
end
其中“调用函数名”是指已经存在的某个函数名,且该函数原型中的首个参数必须能够接收函数Function类型;实参表则是除了首个函数参数外的其他参数值;而“匿名函数参变量表”则是待定义的匿名函数各参数,以逗号分隔。
以之前的函数g(f, x, y, z)
为例,可通过do代码块传入匿名参数对其实现调用,例如:
julia> g(2, 3, 4) do x, y, z
x +y+z
end
9
其中,do x, y, z代码块会创建一个含有三个参数的匿名函数,并将其传递给函数g()作为第一个实参;而g()函数的其余参数则通过自己的实参表提供。
另外,无参的匿名函数同样也可以使用do代码块,以上述的h()函数为例:
julia> h() do
10 + 2
end
12
julia> h() do
println("nothing to do")
end
nothing to do
此时,因为匿名函数不需要参数,所以do之后无须提供任何参变量。
若是函数的实现很简短,do代码结构也可以写在同一行,例如:
julia> g(10, 20, 30) do x, y, z x^2+x*y-z end
270
或者:
julia> g(10, 20, 30) do x, y, z a = x^2+x*y-z; b=0.5*a end
135.0
提示:多个实现语句时,最好用分号分开。
酷客网相关文章:
评论前必须登录!
注册