Ein zentrales Ziel von Julia ist es, Berechnungen mit numerischen Daten schnell und effizient durchführen zu können. Sehr viele numerische Daten.
Typischerweise werden die Daten in Arrays (oder einem verwandten Typ) gespeichert, man kann also mit Fug und Recht sagen, dass Arrays das Herz der Sprache Julia bilden.
Arrays können beliebig groß sein (nur begrenzt durch den Speicher deiner Hardware) und beliebig viele Dimensionen haben.
Dieses einführende Konzept konzentriert sich auf die Grundlagen eindimensionaler Arrays, die Vektoren genannt werden.
In Julia ist ein Vektor eine geordnete Folge von Werten, auf die man über eine Indexnummer zugreifen kann.
Der einfachste Weg, einen Vektor zu erstellen, ist, die Werte in eckige Klammern zu schreiben:
julia> num_vec = [1, 4, 9]
3-element Vector{Int64}:
1
4
9
julia> str_vec = ["arrays", "are", "important"]
3-element Vector{String}:
"arrays"
"are"
"important"
Der Vektor-Typ entspricht dem Typ jedes einzelnen Elements.
Brauchen Vektoren also homogen zu sein (alle Elemente vom selben Typ)?
Auf einer gewissen Ebene ja – und es ist empfehlenswert, das anzustreben, wenn du die beste Performance willst.
Julia kann diese Einschränkung jedoch (wenn nötig) umgehen, indem es den Typ Any verwendet:
julia> mixed_vector = [1, "str", 'c']
3-element Vector{Any}:
1
"str"
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
Wenn du einen leeren Vektor erstellst, verwendet Julia standardmäßig den Elementtyp Any, aber du kannst ihn genauer festlegen, indem du das leere Array mit dem gewünschten Elementtyp annotierst.
julia> empty_vec = []
Any[]
julia> empty_int_vec = Int64[]
Int64[]
Bitte lies und merke dir diese Regel:
Das ist für alle vertraut, die andere Data-Science-Sprachen verwendet haben (R, Matlab, Fortran ...), mag aber für Informatiker mit einem Hintergrund in C-ähnlichen Sprachen schockierend erscheinen.
Ansonsten funktionieren Indizes so, wie du vermutest: Du schreibst sie einfach in eckige Klammern:
squares = [0, 1, 4, 9, 16]
squares[1] # 0
squares[3] # 4
squares[begin] # 0 ("begin" is synonym for 1)
squares[end] # 16 ("end" is synonym for length(squares))
Beachte, wie praktisch die Indizierung mit end (sehr nützlich) und begin (wohl eher nicht) ist.
Python-Programmierer fragen sich vielleicht, was es mit negativen Indizes auf sich hat.
Vergiss es: Die gibt es in Julia nicht, und sie lösen einen BoundsError aus. Dasselbe gilt für jeden Index kleiner als 1 oder größer als length(squares).
Vektoren in Julia sind veränderbar: Wir können den Inhalt einzelner Zellen ändern.
julia> vals = [1, 3, 5, 7]
4-element Vector{Int64}:
1
3
5
7
julia> vals[2] = 4 # reassign the value of this element
4
# Only the value at position 2 changes:
julia> vals
4-element Vector{Int64}:
1
4
5
7
Es gibt viele Funktionen zum Bearbeiten von Vektoren, auch wenn die Julia-Dokumentation sie allgemeiner auf „Collections“ statt auf Vektoren bezieht.
Beachte, dass Funktionen, die ihre Eingabe verändern, per Konvention ein ! im Namen haben.
Der Compiler erzwingt das nicht, aber es ist eine sehr starke Konvention in der Julia-Welt.
Hier sind einige der nützlichen Funktionen:
push!().pop!().pushfirst!() und popfirst!().insert!() und deleteat!().julia> vals = [1, 3]
2-element Vector{Int64}:
1
3
julia> push!(vals, 5, 6) # can add multiple values
4-element Vector{Int64}:
1
3
5
6
julia> pop!(vals) # mutates vals, return popped value
6
julia> vals
3-element Vector{Int64}:
1
3
5
Als angehende Magierin muss Elyse einige Grundlagen üben. Sie hat einen Stapel Karten, den sie bearbeiten möchte.
Um es etwas einfacher zu machen, verwendet sie nur die Karten 1 bis 10, sodass ihr Kartenstapel durch einen Vektor aus Zahlen dargestellt werden kann. Die Position einer bestimmten Karte entspricht dem Index im Vektor.
Um eine Karte auszuwählen, gib die Karte am Index position aus dem gegebenen Stapel zurück.
julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> get_item(stack, position)
4
Führe ein paar Fingerfertigkeiten aus und tausche die Karte am Index position gegen die angegebene Ersatzkarte aus.
Gib den angepassten Stapel zurück.
julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> replacement_card = 6;
julia> set_item!(stack, position, replacement_card)
[1, 2, 6, 1]
Lass eine Karte erscheinen, indem du eine neue Karte oben auf den Stapel legst. Gib den angepassten Stapel zurück.
julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_top!(stack, new_card)
[5, 9, 7, 1, 8]
Lass eine Karte verschwinden, indem du die Karte an der angegebenen position aus dem Stapel entfernst.
Gib den angepassten Stapel zurück.
julia> stack = [3, 2, 6, 4, 8];
julia> position = 3;
julia> remove_item!(stack, position)
[3, 2, 4, 8]
Lass eine Karte verschwinden, indem du die oberste Karte des Stapels entfernst. Gib den angepassten Stapel zurück.
julia> stack = [3, 2, 6, 4, 8];
julia> remove_item_from_top!(stack)
[3, 2, 6, 4]
Lass eine Karte erscheinen, indem du eine neue Karte unten an den Stapel legst. Gib den angepassten Stapel zurück.
julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_bottom!(stack, new_card)
[8, 5, 9, 7, 1]
Lass eine Karte verschwinden, indem du die unterste Karte des Stapels entfernst. Gib den angepassten Stapel zurück.
julia> stack = [8, 5, 9, 7, 1];
julia> remove_item_at_bottom!(stack)
[5, 9, 7, 1]
Prüfe, ob die Größe des Stapels gleich stack_size ist oder nicht.
julia> stack = [3, 2, 6, 4, 8];
julia> stack_size = 4;
julia> check_size_of_stack(stack, stack_size)
false
Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.