Be

Bereiche in Julia

1 Übung

Über Bereiche

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.

Buchstaben-Ranges

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.

Funktionen und Operatoren für Ranges

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.

Mehr zum Indizieren von Arrays

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.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Bereiche