在 Julia 中定义函数内的函数

log*_*ick 7 julia

我想知道是否有任何关于在函数中定义函数是推荐还是避免在 Julia 中的指导。

我阅读了Julia Docs 中函数部分,但没有看到提到这个主题。

旁注是有人向我提到这是 Python 中的建议行为,这就是在我脑海中引发这个问题的原因。

Cam*_*nek 3

如果您想返回一个闭包,通常只在另一个函数中定义一个函数。闭包是一个带有一些与之关联的数据的函数。当您从函数返回函数时,返回的(内部)函数将“捕获”在定义内部函数的同一局部函数作用域中定义的变量。下面是一个使用闭包的例子:

julia> function make_adder(amount)
           function add(x)
               return x + amount
           end
       end;

julia> add_one = make_adder(1);

julia> add_two = make_adder(2);

julia> 10 |> add_one
11

julia> 10 |> add_two
12
Run Code Online (Sandbox Code Playgroud)

请注意, 由 返回的函数make_adder捕获 的值amount,该值作为 的参数提供make_adder

返回匿名函数同样有效:

julia> function make_adder(amount)
           return x -> x + amount
       end;

julia> add_three = make_adder(3);

julia> 10 |> add_three
13
Run Code Online (Sandbox Code Playgroud)

Julia 中的闭包有时可能会出现性能问题。如有必要,可以使用FastClosures.jl解决性能问题。

这里还有几个闭包的例子:

julia> function make_counter()
           x = 0
           return () -> (x = x + 1; x)
       end;

julia> counter = make_counter();

julia> counter()
1

julia> counter()
2

julia> counter()
3
Run Code Online (Sandbox Code Playgroud)
julia> function numerical_derivative(f, dx)
           function dfdx(x)
               (f(x + dx) - f(x)) / dx
           end
       end;

julia> numerical_sine_derivative = numerical_derivative(sin, 0.1);

julia> numerical_sine_derivative(0) # Derivative of sin(x) at 0 equals 1
0.9983341664682815
Run Code Online (Sandbox Code Playgroud)