首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >元组对元组

元组对元组
EN

Stack Overflow用户
提问于 2022-02-23 15:37:34
回答 1查看 80关注 0票数 3

为什么在使用tupleTuple转换向量时得到以下不同的结果

代码语言:javascript
复制
julia> a = [1, 2, 3]
3-element Vector{Int64}:
1
2
3

julia> tuple(a)
([1, 2, 3],)

julia> Tuple(a)
(1, 2, 3)

然而,广播也产生了同样的结果:

代码语言:javascript
复制
julia> tuple.(a)
3-element Vector{Tuple{Int64}}:
(1,)
(2,)
(3,)

julia> Tuple.(a)
3-element Vector{Tuple{Int64}}:
(1,)
(2,)
(3,)

(后者并不奇怪,因为它只是将单个数字转换为元组。)

(这是Julia 1.6.1。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-23 16:18:49

Tuple是一个类型,与Julia中的所有集合一样,如果将另一个集合传递给它,它将从另一个集合的内容创建该类型的实例。因此,Tuple([1, 2, 3])构造了值1、2和3的元组,就像Set([1, 2, 3])构造了一组相同的值一样。类似地,如果编写Dict([:a => 1, :b => 2, :c => 3]),就会得到一个包含对:a => 1:b => 2:c => 3的dict。当构造函数的参数是迭代器时,这也能很好地工作;下面的例子如下:

代码语言:javascript
复制
julia> Tuple(k^2 for k=1:3)
(1, 4, 9)

julia> Set(k^2 for k=1:3)
Set{Int64} with 3 elements:
  4
  9
  1

julia> Dict(string(k, base=2, pad=2) => k^2 for k=1:3)
Dict{String, Int64} with 3 entries:
  "10" => 4
  "11" => 9
  "01" => 1

这就是为什么Tuple的工作方式是这样的。另一方面,tuple函数是一个从其参数中生成元组的函数,如下所示:

代码语言:javascript
复制
julia> tuple()
()

julia> tuple(1)
(1,)

julia> tuple(1, "two")
(1, "two")

julia> tuple(1, "two", 3.0)
(1, "two", 3.0)

为什么有tuple而不是只拥有Tuple呢?您可以将最后一个示例表示为Tuple([1, "two", 3.0])。但是,这需要构造一个临时的非类型化数组来迭代它并从它的内容中生成一个元组,这实际上是效率低下的。如果有一种更有效的容器类型,编译器通常可以消除.就像一个元组。为此,我们将编写Tuple((1, "two", 3.0))。它可以工作,但是是完全多余的,因为(1, "two", 3.0)已经是您想要的元组了。那么你为什么要使用tuple呢?大多数情况下,您只使用(1, "two", 3.0)语法来构造元组。但是有时您需要一个实际的函数,您可以将它应用于一些值,以获得它们的一个元组--而tuple就是这个函数。实际上,您可以创建一个很容易做到这一点的匿名函数:(args...) -> (args...,)。您只需将tuple看作是该函数的一个方便的缩写。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71239909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档