虽然 Julia 允许我们随意改变一个变量的类型,但是这样做往往会对程序的性能造成不小的负面影响。我们可以在编程的时候用附加类型标识符的方式让变量的类型固定下来,比如:y::Int64。操作符::可以将类型标识符附加到程序中的变量和表达式之后。
我们可以使用关键字const来定义一个常量。在 Julia 中,常量是一种特殊的变量:const A = 2020
关于变量作用域,变量默认都是local的,使用global可以突破限制。注意下面的1:5是UnitRange类型,如果是1:2:5,则是StepRange类型。

操作符<:用于表示当前类型直接继承自哪一个抽象类型,可以在定义和声明中使用:
julia> abstract type Jewelry end
julia> struct Necklace <: Jewelry end
julia> struct Ring <: Jewelry end
julia> mutable struct JewelryShop{T<:Jewelry}
showcase1::Showcase{Necklace}
showcase2::Showcase{Ring}
showcase3::Showcase{Jewelry}
showcase4::Showcase{T}
end
使用typeof查看变量类型
julia> typeof(2020)
Int64
在Julia的类型图中,Any是一个唯一的顶层类型,union是唯一一个底层类型。Julia 中具体的数值类型一共有 19 个。罗列如下:
布尔类型:Bool
有符号整数类型:BigInt、Int8、Int16、Int32、Int64和Int128
无符号整数类型:UInt8、UInt16、UInt32、UInt64和UInt128
浮点数类型:BigFloat、Float16、Float32和Float64
复数类型:Complex
有理数类型:Rational
无理数类型:Irrational

抽象类型不能被实例化,而Int64/Float64等都是抽象类型的具体类型,抽象类型不能直接使用,类似于C++中的抽象类。抽象类型有:
abstract type Number end
abstract type Real <: Number end
abstract type AbstractFloat <: Real end
abstract type Integer <: Real end
abstract type Signed <: Integer end
abstract type Unsigned <: Integer end
可以用来构造复杂的类,也叫自定义类型。

初学者看懂julia的代码,这段是关键。参数化类型类似于c++中的template,通过参数的形式代表整个类型族群。
像Ref{T}这样的参数化类型,我们可以用任何一个类型的名称替换掉T,从而表示一种确定的类型,如Ref{String},这样我们就用一个表达式,涵盖了所有的数据类型:

Julia 已经预定义了不少的参数化类型,对它们的进一步说明如下:

where关键字用于对参数的类型进行界定:

元组(tuple)是一种很简单的容器。使用()定义,和python类似。
tuple中可以加入变量名,叫namedTuple,使用.进行调用:

元组类型的最后一个参数可以是Vararg,表示后面可以跟任意多个参数:

用collect()可以将数值tuple 转换为 array:
julia> collect((1,2,3))
3-element Array{Int64,1}:
1
2
3
字典使用关键字Dict定义,并且用=>进行赋值。带=>的部分叫做pair,pair数组可以强制转换为dict。字典使用[ ]进行调用:
julia> d = Dict("a"=>1, "b"=>2, "c"=>3);
julia> a = Dict([(1, "a"), (2, "b"), (3, "c")])
Dict{Int64,String} with 3 entries:
2 => "b"
3 => "c"
1 => "a"
julia> a[1]
"a"
julia> k = ["a","b"]; v = [1,2]
julia> Dict(k.=>v)
使用value可以获得包含所有值的迭代器。
在julia中,数组和矩阵都是Array格式,和numpy不一样。高于二维的数组,需要使用reshape的方式定义。
向量:定义为Array{T}(undef, dims) ,undef是UndefInitializer()的缩写
列向量:[1;2;3]
行向量:[1 2 3]
显式声明:p = Array{Float64}(undef, 3, 1)
向量的元素可以是tuple:pairs = Array{Tuple{Int64,Int64}}(undef, 3),或者这样声明:pairs = [(2,3),(1,2),(3,4)]
如果要初始化,则用fill:fill(1.0, (2,3))
矩阵:其实就是二维向量,比如[1 2 3;4 5 6]
下标访问:A[1,2]
转置:transpose(A)或A’
函数和numpy基本一致
使用[:]的方式进行数组/矩阵拷贝。

再来看矩阵拼接中的三种方式:

矩阵运算分两种,逐点计算和矩阵计算:



如果还是不会用,就使用numpy吧:

对于字符和字符串,Julia 通常都会采用 UTF-8 编码格式将它们转换成二进制数并进行存储。
julia> 'a'
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
julia> '\u4e2d'
'中': Unicode U+4e2d (category Lo: Letter, other)


使用:构造一个symbol,或者直接用Symbol来定义;如果是多行表达式,使用quote…end实现

使用dump来查看symbol,使用eval来解析symbol:
