假设你想要 1000 以内的所有非负整数。 如果要把它们一个个敲进数组里,那就太荒唐了。
为此,我们有range类型:
julia> 0:1000
0:1000
julia> typeof(0:1000)
UnitRange{Int64}
区间非常常见:不仅是为了省去你手动输入的麻烦,也常常作为函数的返回类型。
注意,区间并不是向量。 它们只是一组用来生成序列的指令(也就是“惰性”求值,或者说“迭代器”)。
如果你需要把区间当作向量使用,就用collect()函数来转换:
julia> collect(0:5)
6-element Vector{Int64}:
0
1
2
3
4
5
还可以指定步长,这里是 0.3:
julia> collect(1.0:0.3:2.0)
4-element Vector{Float64}:
1.0
1.3
1.6
1.9
所以语法是start:stepsize:stop。
正如整数示例中所见,两个端点都是_包含_的。
如果步长不能整除stop - start,最后一个元素就不会超过stop。
区间中也可以使用非数字序列。 最简单的例子是 ASCII 字母:
julia> 'a':'d'
'a':1:'d'
julia> typeof('a':'d')
StepRange{Char, Int64}
julia> collect('a':'d')
4-element Vector{Char}:
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
Char类型会在另一个概念中更详细地讲解。
现在,只需把它们当作单引号里的单个字符即可。
用first()和last()查看区间的端点。
r = 1:10 # => 1:10
first(r) # => 1
last(r) # => 10
整数区间和向量都可以用在向量下标中:
nums = collect(10.0:50.0)
nums[3:2:7] # gives [12.0, 14.0, 16.0]
nums[ [3, 5, 7] ] # also gives [12.0, 14.0, 16.0]
作为一名国际象棋爱好者,你很想写出属于自己的版本。没错,网上可能已经有很多现成的国际象棋实现了,但你的版本会独一无二!
不过,在放飞想象力之前,得先把基础打好。我们就从生成棋盘开始吧。
棋盘上的每一格都由一个字母与数字的组合来标识。竖直方向的一列格子称为 file,用字母 A 到 H 标记;水平方向的一行格子称为 rank,用数字 1 到 8 编号。
实现rank_range()函数,它应该返回一个整数范围,从 1 到 8。
julia> rank_range()
# output omitted
实现file_range()函数,它应该返回一个字符范围,从大写字母 A 到大写字母 H。
julia> file_range()
# output omitted
实现ranks()函数,它应该返回一个整数向量,从 1 到 8。不要手动写出这个向量,而是用rank_range()函数返回的范围来生成它。
julia> ranks()
[1, 2, 3, 4, 5, 6, 7, 8]
实现files函数,它应该返回一个字符向量,从 'A' 到 'H'。不要手动写出这个向量,而是用file_range()函数返回的范围来生成它。
julia> files()
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']