我想知道是否有任何关于在函数中定义函数是推荐还是避免在 Julia 中的指导。
我阅读了Julia Docs 中的函数部分,但没有看到提到这个主题。
旁注是有人向我提到这是 Python 中的建议行为,这就是在我脑海中引发这个问题的原因。
如果您想返回一个闭包,通常只在另一个函数中定义一个函数。闭包是一个带有一些与之关联的数据的函数。当您从函数返回函数时,返回的(内部)函数将“捕获”在定义内部函数的同一局部函数作用域中定义的变量。下面是一个使用闭包的例子:
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)