Viele Sprachen kennen etwas wie null oder none, um einen nicht existierenden Wert anzugeben.
Da Julia dafür ausgelegt ist, große Mengen (oft unordentlicher) Daten zu verarbeiten, gibt es mehrere Formen des Nichts.
Das übergeordnete Ziel ist, fehlende oder verdächtige Werte zu markieren, sobald sie auftauchen, und dann weiterzumachen, ohne eine Ausnahme auszulösen.
nothingWenn ein Wert wirklich nicht existiert, wird er durch nothing dargestellt. Das kommt wohl am ehesten dem nahe, was C (NULL) oder Python (None) tun würden.
julia> n = nothing
julia> isnothing(n)
true
julia> typeof(n)
Nothing
nothing ist also ein Singleton-Wert vom Typ Nothing, und wir können ihn testen.
Eine häufige Verwendung von nothing ist der Rückgabewert (bzw. Nicht-Rückgabewert) für Funktionen, die nur wegen ihrer Seiteneffekte verwendet werden (Ausgabe, Netzwerkkonfiguration oder was auch immer).
missingFür Situationen, in denen ein Wert theoretisch existiert, wir aber nicht wissen, welcher, verwendet man missing.
Wenn zum Beispiel Fahrzeuge auf einer Straße gezählt werden, brauchen menschliche Beobachter vielleicht eine Pause, oder automatische Sensoren fallen aus, aber der Verkehr fließt weiter.
missing ist also ein Platzhalter, der Menschen darauf hinweist, dass sie entscheiden müssen, wie sie mit dieser Lücke in den Daten umgehen.
julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
1
2
missing
julia> typeof(mv)
Vector{Union{Missing, Int64}} (alias for Array{Union{Missing, Int64}, 1})
julia> ismissing.(mv) # broadcast function, displays as 1 for true, 0 for false
3-element BitVector:
0
0
1
Nur wenige andere Sprachen haben diese Funktion eingebaut, aber enge Entsprechungen sind NA in R oder NULL in SQL.
Ausdrücke geben standardmäßig missing zurück, wenn missing-Werte vorhanden sind.
Wenn du möchtest, dass diese Werte ignoriert werden, verwende die Funktion skipmissing(), um das ausdrücklich zu machen:
julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
1
2
missing
julia> sum(mv) # missing in, missing out
missing
julia> skipmissing(mv)
skipmissing(Union{Missing, Int64}[1, 2, missing])
julia> collect(skipmissing(mv))
2-element Vector{Int64}:
1
2
julia> sum(skipmissing(mv)) # functions like sum() can work with iterators
3
Da skipmissing einen Iterator erzeugt, packe ihn in collect(), wenn du einen Vektor brauchst.
Manchmal ist es nützlich, missing-Werte durch einen Standardwert zu ersetzen.
Das Makro @coalesce() ist dafür nützlich, denn es gibt den ersten Nicht-missing-Wert zurück (oder missing, wenn es sonst nichts gibt).
julia> str = ["I", "exist", missing]
3-element Vector{Union{Missing, String}}:
"I"
"exist"
missing
julia> [@coalesce(s, "-") for s in str]
3-element Vector{String}:
"I"
"exist"
"-"
NaNNaN ist die Abkürzung für „Not a Number“ und markiert ein Berechnungsproblem in Situationen, in denen eine Zahl erwartet wurde.
julia> v = [0, 1, -1]
3-element Vector{Int64}:
0
1
-1
julia> v / 0
3-element Vector{Float64}:
NaN
Inf
-Inf
julia> sum(v / 0)
NaN
Jede Art von Berechnung mit Daten, die ein NaN enthalten, ergibt ein NaN-Ergebnis.
Aktuell gibt es keine spezielle Funktion, um NaN-Werte zu entfernen, aber die Standardfunktion filter() kann das ganz einfach erledigen.
Nur Werte, für die eine gegebene Bedingung true ist, werden in das Ergebnis-Array kopiert:
julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
1.0
2.0
In dieser Übung schreibst du Code, um Namensschilder zu erstellen, die Fabrikmitarbeiter tragen. Mitarbeiter haben eine ID, einen Namen und einen Abteilungsnamen. Die Beschriftung der Mitarbeiterschilder ist wie folgt formatiert: "[id] - name - DEPARTMENT".
Implementiere die Funktion print_name_badge. Sie soll eine ID, einen Namen und eine Abteilung entgegennehmen. Sie soll die Beschriftung des Schilds zurückgeben, wobei der Abteilungsname in Großbuchstaben steht.
julia> print_name_badge(67, "Katherine Williams", "Strategic Communication")
"[67] - Katherine Williams - STRATEGIC COMMUNICATION"
Aufgrund einer Eigenheit im Computersystem haben neue Mitarbeiter manchmal noch keine ID, wenn sie anfangen, in der Fabrik zu arbeiten. Da Schilder Pflicht sind, erhalten sie ein vorläufiges Schild ohne das ID-Präfix.
Erweitere die Funktion print_name_badge. Wenn die ID fehlt, soll sie ein Schild ohne sie erstellen.
julia> print_name_badge(missing, "Robert Johnson", "Procurement")
"Robert Johnson - PROCUREMENT"
Selbst der Besitzer der Fabrik muss jederzeit ein Schild tragen. Ein Besitzer hat jedoch keine Abteilung und wird auch nie eine haben: Er steht über allen Abteilungen. In diesem Fall soll die Beschriftung "OWNER" anstelle des Abteilungsnamens zurückgeben.
Erweitere die Funktion print_name_badge. Wenn die Abteilung nothing ist, gehe davon aus, dass das Schild dem Firmenbesitzer gehört.
julia> print_name_badge(204, "Rachel Miller", nothing)
"[204] - Rachel Miller - OWNER"
Beachte, dass es möglich ist, dass der Besitzer auch ein neuer Mitarbeiter ist.
julia> print_name_badge(missing, "Rachel Miller", nothing)
"Rachel Miller - OWNER"
Als grobe Kennzahl dafür, wie gut die IDs ausgegeben werden, möchtest du das Gesamtgehalt der Mitarbeiter ohne ID sehen. Ein hoher Wert bedeutet, dass viele warten oder dass das Problem auch Mitarbeiter in höheren Positionen betrifft: beides schlecht.
Implementiere die Funktion salaries_no_id, die einen Vektor von IDs und einen entsprechenden Vektor von Gehältern entgegennimmt und die Summe der Gehälter für Personen zurückgibt, die noch keine ID haben. Beide Vektoren haben die gleiche Länge.
julia> ids = [204, missing, 210, 352, missing, 263]
julia> salaries = [23, 21, 47, 35, 17, 101] * 1000
julia> salaries_no_id(ids, salaries)
38,000
Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.