Julia匿名函数

Julia匿名函数

在函数作为参数或返回值时,如果定义体较为简单,可以不用预先定义该函数,而采用更为简单、直接的匿名函数。匿名函数不需要函数名,只需提供参数需求及实现体即可。其定义的基本语法为:

        function (参数表)
          # 实现体
        end

或者采用另外一种更为常用的方式,即:

        (参数表) -> 复合表达式

其中,符号->用于连接函数参数与实现体部分。在后一种简单的方式中,如果参数只有一个,圆括号可以省略;但无参数或多于一个参数时,圆括号不可省略。

下面是一些匿名函数的例子:
Julia匿名函数

从成功信息看,与前面介绍的普通非匿名函数相同,都是“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

提示:多个实现语句时,最好用分号分开。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!