Suppose que tu veuilles tous les entiers positifs ou nuls jusqu'à 1000. Il serait ridicule de devoir les taper un par un dans un tableau.
Pour cela, on dispose du type range :
julia> 0:1000
0:1000
julia> typeof(0:1000)
UnitRange{Int64}
Les ranges sont très courants : non seulement pour t'éviter de tout taper, mais aussi comme valeurs de retour de fonctions.
Note que les ranges ne sont pas des tableaux.
Les tableaux sont définis dès le départ (évaluation « gloutonne »), et leur stockage est proportionnel à leur longueur.
En revanche, les ranges ne sont qu'un ensemble d'instructions servant à générer une séquence (évaluation « paresseuse », ou « itérateur »).
Si tu as besoin d'un range sous forme de tableau, utilise la fonction collect() pour le convertir :
julia> collect(0:5)
6-element Vector{Int64}:
0
1
2
3
4
5
Tu peux aussi utiliser collect(type, range) pour préciser le type du tableau obtenu.
On peut préciser le pas, ici 0,3 :
julia> collect(1.0:0.3:2.0)
4-element Vector{Float64}:
1.0
1.3
1.6
1.9
La syntaxe est donc start:stepsize:stop.
Les deux bornes sont incluses, comme le montre l'exemple avec les entiers.
Si le pas ne divise pas exactement stop - start, le dernier élément ne dépassera pas stop.
Pour un contrôle plus fin, utilise la fonction Base.range(), qui offre plusieurs options supplémentaires.
On peut aussi utiliser des séquences non numériques dans les ranges. L'exemple le plus simple est celui des lettres 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)
Le type Char sera abordé plus en détail dans un autre concept.
Pour l'instant, considère ces valeurs comme de simples caractères entre apostrophes.
Vérifie les bornes d'un range avec first() et last().
Il est souvent utile de savoir si une valeur particulière fait partie d'un range.
La fonction sous-jacente est in(), mais on utilise plus couramment l'opérateur infixe in ou son synonyme plus mathématique ∈.
Dans un éditeur adapté, le raccourci pour ∈ s'obtient en tapant \in puis la touche tabulation.
r = 1:10 # => 1:10
first(r) # => 1
last(r) # => 10
7 in r # => true
11 ∈ r # => false
L'opérateur in ou ∈ est utilisé ici avec des ranges, mais il peut aussi servir avec plusieurs autres types de collections, comme les vecteurs, les ensembles et les dictionnaires.
Les ranges d'entiers et les tableaux peuvent être utilisés pour indexer un tableau :
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]
L'utilisation avec end fonctionne aussi, même si la priorité des opérateurs peut rendre les parenthèses nécessaires :
nums[(end - 3):end]
4-element Vector{Float64}:
47.0
48.0
49.0
50.0
Bien sûr, chacun des indices peut être une variable entière déjà définie.