Tracks
/
Julia
Julia
/
Übungen
/
Namensschilder
Namensschilder

Namensschilder

Lernübung

Einführung

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.

nothing

Wenn 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).

missing

Fü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"
 "-"

NaN

NaN 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

Anleitung

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".

1. Erstelle ein Schild für einen Mitarbeiter

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"

2. Erstelle ein Schild für einen neuen Mitarbeiter

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"

3. Erstelle ein Schild für den Besitzer

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"

4. Berechne das Gesamtgehalt der Mitarbeiter ohne ID

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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Julia Exercism

Bereit, mit Namensschilder zu starten?

Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.