Julia 元组

Julia 的元组与数组类似,都是有序的元素集合,不同之处在于元组的元素不能修改。

另外元组使用小括号 (...) ,数组使用方括号 [...]

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可,数组中的很多函数也可以在元组中使用。

如下实例:

实例

julia > tupl=( 5 , 10 , 15 , 20 , 25 , 30 )   # 创建一个元组
( 5 , 10 , 15 , 20 , 25 , 30 )

julia > tupl
( 5 , 10 , 15 , 20 , 25 , 30 )

julia > tupl [ 3 : end ]           # 输出第三个到最后一个元素的元组
( 15 , 20 , 25 , 30 )

julia > tupl = ( ( 1 , 2 ) , ( 3 , 4 ) )   # 创建二维元组
( ( 1 , 2 ) , ( 3 , 4 ) )

julia > tupl [ 1 ]       # 访问二维元组元素,输出第一维元组
( 1 , 2 )

julia > tupl [ 1 ] [ 2 ]     # 访问二维元组元素,输出第一维元组的第二个元素
2

元组的元素是不能修改,如果我们尝试修改它就回报错:

实例

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

julia > tupl2 [ 2 ] =
ERROR: MethodError: no method matching setindex ! ( ::NTuple { 4 , Int64 } , :: Int64 , :: Int64 )
Stacktrace:
  [ 1 ] top-level scope
   @ REPL [ 8 ] : 1

元组命名

我们可以为元组命名,从而可以更方便的访问它。

以下列出了几种不同元组的命名方式。

1、元组中的键(key)和值(value)分开命名

元组中的键(key)和值(value)可以分开独立命名,实例如下:

实例

julia > names_shape = ( :corner1, :corner2 )
( :corner1, :corner2 )

julia > values_shape = ( ( 100 , 100 ) , ( 200 , 200 ) )
( ( 100 , 100 ) , ( 200 , 200 ) )

julia > shape_item2 = NamedTuple { names_shape } ( values_shape )
( corner1 = ( 100 , 100 ) , corner2 = ( 200 , 200 ) )

我们可以使用 . 点号来访问元组:

实例

julia > shape_item2. corner1
( 100 , 100 )

julia > shape_item2. corner2
( 200 , 200 )

2、键(key)和值(value)同时在一个元组中

键(key)和值(value)可以同时在一个元组中,实例如下:

实例

julia > shape_item = ( corner1 = ( 1 , 1 ) , corner2 = ( - 1 , - 1 ) , center = ( , ) )
( corner1 = ( 1 , 1 ) , corner2 = ( - 1 , - 1 ) , center = ( , ) )

我们可以使用 . 点号来访问元组:

实例

julia > shape_item. corner1
( 1 , 1 )

julia > shape_item. corner2
( - 1 , - 1 )

julia > shape_item. center
( , )

julia > ( shape_item. center ,shape_item. corner2 )
( ( , ) , ( - 1 , - 1 ) )

我们还可以像使用普通元组一样访问所有值,如下所示:

实例

julia > c1, c2, center = shape_item
( corner1 = ( 1 , 1 ) , corner2 = ( - 1 , - 1 ) , center = ( , ) )

julia > c1
( 1 , 1 )

3、合并两个已命名的元组

我们可以使用 merge() 函数来合并两个已命名的元组,实例如下:

实例

julia > colors_shape = ( top = "red" , bottom = "green" )
( top = "red" , bottom = "green" )

julia > shape_item = ( corner1 = ( 1 , 1 ) , corner2 = ( - 1 , - 1 ) , center = ( , ) )
( corner1 = ( 1 , 1 ) , corner2 = ( - 1 , - 1 ) , center = ( , ) )

julia > merge ( shape_item, colors_shape )
( corner1 = ( 1 , 1 ) , corner2 = ( - 1 , - 1 ) , center = ( , ) , top = "red" , bottom = "green" )

元组作为函数参数

以下实例我们创建一个 testFunc 函数,并将元组 options 作为参数传入:

实例:test.jl 文件代码

# 创建函数
function testFunc ( x, y, z ; a=10 , b=20 , c=30 )
    println ( "x = $x, y = $y, z = $z; a = $a, b = $b, c = $c" )
  end

# 创建元组
 options = ( b = 200 , c = 300 )
 
# 执行函数,元组作为参数传入
 testFunc ( 1 , 2 , 3 ; options... )

使用 julia 命令执行以上文件,输出结果为:

				$ julia test.jl
x = 1, y = 2, z = 3; a = 10, b = 200, c = 300
			

如果指定的参数在元组后面,则会覆盖元组中已有的参数:

实例

# 创建函数
function testFunc ( x, y, z ; a=10 , b=20 , c=30 )
    println ( "x = $x, y = $y, z = $z; a = $a, b = $b, c = $c" )
  end

# 创建元组
 options = ( b = 200 , c = 300 )

# 执行函数,元组作为参数传入,指定参数在元组前,不会覆盖
testFunc ( 1 , 2 , 3 ; b = 1000 _000, options... )

# 执行函数,元组作为参数传入,指定参数在元组后,会覆盖
testFunc ( 1 , 2 , 3 ; options..., b= 1000 _000 )

使用 julia 命令执行以上文件,输出结果为:

	$ julia test.jl
x = 1, y = 2, z = 3; a = 10, b = 200, c = 300
x = 1, y = 2, z = 3; a = 10, b = 1000000, c = 300