Angenommen, du willst alle nicht-negativen Ganzzahlen bis 1000. Es wäre doch absurd, wenn du sie alle in ein Array eintippen müsstest.
Dafür gibt es den Typ range:
julia> 0:1000
0:1000
julia> typeof(0:1000)
UnitRange{Int64}
Ranges sind sehr verbreitet: nicht nur, um dir Tipparbeit zu sparen, sondern auch als Rückgabewerte von Funktionen.
Beachte, dass Ranges keine Arrays sind.
Arrays werden von Anfang an definiert („greedy“ Auswertung) und brauchen Speicher, der proportional zur Länge des Arrays ist.
Im Gegensatz dazu sind Ranges nur eine Reihe von Anweisungen, um eine Folge zu erzeugen („lazy“ Auswertung oder ein „Iterator“).
Wenn du eine Range als Array brauchst, nutze die Funktion collect() zum Umwandeln:
julia> collect(0:5)
6-element Vector{Int64}:
0
1
2
3
4
5
Optional kannst du auch collect(type, range) verwenden, um den Typ des Ausgabe-Arrays anzugeben.
Die Schrittweite kannst du angeben, in diesem Fall 0.3:
julia> collect(1.0:0.3:2.0)
4-element Vector{Float64}:
1.0
1.3
1.6
1.9
Die Syntax lautet also start:stepsize:stop.
Beide Grenzwerte sind inklusiv, wie das Ganzzahl-Beispiel zeigt.
Wenn die Schrittweite stop - start nicht ohne Rest teilt, überschreitet das letzte Element stop nicht.
Für mehr Kontrolle nutzt du die Funktion Base.range(), die noch einige Optionen mehr bietet.
In Ranges können auch nicht-numerische Folgen verwendet werden. Das einfachste Beispiel sind ASCII-Buchstaben:
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)
Der Typ Char wird in einem anderen Konzept genauer behandelt.
Betrachte sie vorerst einfach als einzelne Zeichen in einfachen Anführungszeichen.
Prüfe die Grenzen einer Range mit first() und last().
Oft ist es nützlich, herauszufinden, ob ein bestimmter Wert Teil einer Range ist.
Die zugrunde liegende Funktion dafür ist in(), aber üblicher ist der Infix-Operator in oder sein mathematischeres Synonym ∈.
In einem geeigneten Editor lautet das Tastenkürzel für ∈ \in, gefolgt von Tab.
r = 1:10 # => 1:10
first(r) # => 1
last(r) # => 10
7 in r # => true
11 ∈ r # => false
Der Operator in bzw. ∈ wird hier mit Ranges verwendet, funktioniert aber auch mit verschiedenen anderen Sammeltypen wie Vektoren, Mengen und Wörterbüchern.
Ganzzahl-Ranges und Arrays können zum Indizieren von Arrays verwendet werden:
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]
Auch die Verwendung mit end funktioniert, allerdings können wegen der Operatorrangfolge runde Klammern nötig sein:
nums[(end - 3):end]
4-element Vector{Float64}:
47.0
48.0
49.0
50.0
Natürlich kann jedes der Indexelemente eine bereits vorhandene Ganzzahl-Variable sein.