Julia之初体验(十二)函数3

在Julia中,返回一个元组值以模拟返回多个值。但是,可以在不需要括号的情况下创建和分解元组,从而产生一种幻想,即返回多个值而不是单个元组值。例如,以下函数返回一对值:

julia> function foo(a,b)
           a+b, a*b
       end
foo (generic function with 1 method)

如果在交互式会话中调用它而未在任何地方分配返回值,则将看到返回的元组:

julia> foo(2,3)
(5, 6)

但是,这种返回值对的典型用法是将每个值提取到变量中。Julia支持简单的元组“解构”,从而简化了此过程:

julia> x, y = foo(2,3)
(5, 6)

julia> x
5

julia> y
6

您还可以通过显式使用return关键字来返回多个值:

function foo(a,b)
    return a+b, a*b
end

与的先前定义完全相同foo

Varargs函数

能够编写带有任意数量参数的函数通常很方便。此类函数在传统上称为“可变参数”函数,是“可变数量的参数”的缩写。您可以在最后一个参数后面加上省略号来定义varargs函数:

julia> bar(a,b,x...) = (a,b,x)
bar (generic function with 1 method)

变量ab通常绑定到前两个参数值,变量x绑定到bar在其前两个参数之后传递的零个或多个值的可迭代集合:

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,6)
(1, 2, (3, 4, 5, 6))

在所有这些情况下,x都绑定到传递给的尾随值的元组bar

可以限制作为变量参数传递的值的数量。稍后将在参数约束Varargs方法中对此进行讨论。

另一方面,将可迭代集合中包含的值作为单独的参数“拼接”到函数调用中通常很方便。为此,还可以...在函数调用中使用but:

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

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

在这种情况下,值的元组被精确地连接到varargs调用中,该变量位于可变参数数目所在的位置。但是,不必如此:

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

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

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

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

此外,拼接到函数调用中的可迭代对象不必是元组:

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

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

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

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

同样,参数要加入的函数不必是varargs函数(尽管通常是这样):

julia> baz(a,b) = a + b;

julia> args = [1,2]
2-element Array{Int64,1}:
 1
 2

julia> baz(args...)
3

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

julia> baz(args...)
ERROR: MethodError: no method matching baz(::Int64, ::Int64, ::Int64)
Closest candidates are:
  baz(::Any, ::Any) at none:1

如您所见,如果拼接容器中的元素数量错误,则函数调用将失败,就像显式给出太多参数一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bowen2006

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值