Julia

不定参数

不定参数的函数也称变参函数

函数的参数可以被定义成任意个

可以在最后一个参数后紧跟省略号“...”来定义变参函数

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method)

对变参函数进行参数传递

julia> bar(1)
ERROR: MethodError: no method matching bar(::Int64)
Closest candidates are:
  bar(::Any, ::Any, ::Any...) at REPL[1]:1
Stacktrace:
 [1] top-level scope at none:0

julia> bar(1, 2)
(1, 2, ())

julia> bar(1, 2, 3)
(1, 2, (3,))

julia> bar(1, 2, 3, 4)
(1, 2, (3, 4))

julia> bar(1, 2, 3, 4, 5)
(1, 2, (3, 4, 5))

最前的两个参数 x,y 为普通的参数,需要对其进行传值,不然就报错了

变量 z 是尾随的可迭代的参数集合,其参数个数为 0 或多个,返回的是一个多元组

函数调用时,也可以使用“...”

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method)

julia> z = (3, 4)
(3, 4)

julia> bar(1, 2, z...)
(1, 2, (3, 4))

多元组的值完全按照变参函数的定义进行内插,也可以不完全遵守其函数定义来调用

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method)

julia> z = (2, 3, 4)
(2, 3, 4)

julia> bar(1, z...)
(1, 2, (3, 4))

julia> z = (1, 2, 3, 4)
(1, 2, 3, 4)

julia> bar(z...)
(1, 2, (3, 4))

被内插的对象也可以不是多元组

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method)

julia> z = [3, 4]
2-element Array{Int64,1}:
 3
 4

julia> bar(1, 2, z...)
(1, 2, (3, 4))

julia> z = [2, 3, 4]
3-element Array{Int64,1}:
 2
 3
 4

julia> bar(1, z...)
(1, 2, (3, 4))

julia> z = [1, 2, 3, 4]
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> bar(z...)
(1, 2, (3, 4))

可选参数

函数的参数可以设置默认值

julia> function f(x, y=3)
           x + y
       end
f (generic function with 2 methods)

julia> f(4)
7

julia> f(4, 5)
9

定义了一个函数 f() ,有两个参数,一个是参数 x,一个是默认值为 3 的参数 y

调用该函数的时候,如果只传入一个值,则这个值赋给参数 x,参数 y 为默认值 3

如果传入两个值,则第一个值赋给参数 x,第二个值赋给参数 y,覆盖了默认值 3

关键字参数

使用关键字参数的函数,在函数签名中使用分号来定义

julia> function f(name, age; sex="male", country="jp")
           println(name)
           println(age)
           println(sex)
           println(country)
       end
f (generic function with 1 method)

julia> f("jack", 23)
jack
23
male
jp

julia> f("jack", country="us",22, sex="female")
jack
22
female
us

julia> f("jack", country="us", sex="female", 34)
jack
34
female
us

额外的关键字参数,可以像变参函数中一样,使用“...”来匹配

function f(x; y=0, args...)
    ###
end

在函数 f 内部, args 可以是 (key,value) 多元组的集合,其中 key 是符号

可以在函数调用时使用分号来传递这个集合,如 f(x, z=1; args...),这种情况下也可以使用字典

关键字参数的默认值仅在必要的时候从左至右地传值(当对应的关键字参数没有被传递),所以默认的(关键字参数的)表达式可以调用在它之前的关键字参数

默认值的求值作用域

可选参数和关键字参数的区别在于它们的默认值是怎样被求值的

当可选的参数被求值时,只有在它之前的的参数在作用域之内

当关键字参数的默认值被计算时, 所有的参数都是在作用域之内

function f(x, a=b, b=1)
    ###
end

在 a=b 中的 b 指的是该函数的作用域之外的 b ,而不是接下来的参数 b

原文地址:https://www.cnblogs.com/sch01ar/p/9508434.html