Διαδρομές
/
Julia
Julia
/
Ασκήσεις
/
Κονκάρδες ονόματος
Κονκάρδες ονόματος

Κονκάρδες ονόματος

Άσκηση εκμάθησης

Εισαγωγή

Πολλές γλώσσες έχουν έναν τρόπο, όπως το null ή το none, για να δηλώσουν μια τιμή που δεν υπάρχει. Επειδή η Julia είναι σχεδιασμένη να χειρίζεται μεγάλους όγκους (συχνά ακατάστατων) δεδομένων, έχει πολλαπλές μορφές για να εκφράσει την απουσία τιμής.

Ο γενικός στόχος είναι να επισημαίνονται οι τιμές που λείπουν ή είναι ύποπτες τη στιγμή που τις συναντάς, και μετά να συνεχίζει το πρόγραμμα χωρίς να πετάει εξαίρεση.

nothing

Αν μια τιμή πραγματικά δεν υπάρχει, αντιπροσωπεύεται από το nothing. Αυτό είναι πιθανώς το πιο κοντινό σε αυτό που κάνει η C (NULL) ή η Python (None).

julia> n = nothing

julia> isnothing(n)
true

julia> typeof(n)
Nothing

Έτσι, το nothing είναι μια τιμή singleton του τύπου Nothing και μπορούμε να το ελέγξουμε.

Μια συνηθισμένη χρήση του nothing είναι ως τιμή επιστροφής (ή μη τιμή) για συναρτήσεις που χρησιμοποιούνται μόνο για τις παρενέργειές τους (εκτύπωση, ρύθμιση δικτύου ή ό,τι άλλο).

missing

Για περιπτώσεις όπου μια τιμή υπάρχει θεωρητικά, αλλά δεν ξέρουμε ποια είναι, χρησιμοποιείται το missing. Για παράδειγμα, όταν μετράς οχήματα που κινούνται σε έναν δρόμο, μπορεί οι ανθρώπινοι παρατηρητές να χρειάζονται διάλειμμα ή να χαλάνε οι αυτόματοι αισθητήρες, αλλά η κυκλοφορία συνεχίζει να ρέει.

Έτσι, το missing είναι ένα σύμβολο υποκατάστασης, που προειδοποιεί τους ανθρώπους ότι πρέπει να αποφασίσουν πώς θα χειριστούν αυτό το κενό στα δεδομένα.

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

Λίγες άλλες γλώσσες έχουν αυτή τη δυνατότητα ενσωματωμένη, αλλά στενά ανάλογα είναι το NA στη R ή το NULL στη SQL.

Οι εκφράσεις συνήθως επιστρέφουν missing εξ ορισμού, αν υπάρχουν τιμές missing. Αν θέλεις να αγνοούνται αυτές οι τιμές, χρησιμοποίησε τη συνάρτηση skipmissing() για να το κάνεις αυτό ρητό:

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

Επειδή το skipmissing δημιουργεί έναν iterator, τύλιξέ το σε collect() αν χρειάζεσαι ένα vector.

Μερικές φορές είναι χρήσιμο να αντικαθιστάς τις τιμές missing με κάποια προεπιλεγμένη τιμή. Η μακροεντολή @coalesce() είναι χρήσιμη γι' αυτό, καθώς επιστρέφει την πρώτη τιμή που δεν είναι missing (ή missing αν δεν υπάρχει κάτι άλλο).

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

Συντομογραφία του "Not a Number", το NaN σηματοδοτεί ένα πρόβλημα υπολογισμού σε καταστάσεις όπου περίμενες έναν αριθμό.

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

Οποιοσδήποτε υπολογισμός σε δεδομένα που περιέχουν NaN θα δώσει αποτέλεσμα NaN.

Προς το παρόν δεν υπάρχει ειδική συνάρτηση για να αφαιρείς τιμές NaN, αλλά η τυπική συνάρτηση filter() μπορεί να το κάνει αρκετά απλά. Μόνο οι τιμές για τις οποίες κάποια δεδομένη συνθήκη είναι true θα αντιγράφονται στον πίνακα αποτελεσμάτων:

julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
 1.0
 2.0

Οδηγίες

Σε αυτή την άσκηση θα γράψεις κώδικα για να δημιουργείς σήματα ονόματος που θα φοράνε οι εργαζόμενοι του εργοστασίου. Οι εργαζόμενοι έχουν ένα ID, ένα όνομα και ένα όνομα τμήματος. Οι ετικέτες των σημάτων των εργαζομένων έχουν την εξής μορφή: "[id] - name - DEPARTMENT".

1. Δημιούργησε ένα σήμα για έναν εργαζόμενο

Υλοποίησε τη συνάρτηση print_name_badge. Πρέπει να δέχεται ένα ID, ένα όνομα και ένα τμήμα. Πρέπει να επιστρέφει την ετικέτα του σήματος, με το όνομα του τμήματος σε κεφαλαία.

julia> print_name_badge(67, "Katherine Williams", "Strategic Communication")
"[67] - Katherine Williams - STRATEGIC COMMUNICATION"

2. Δημιούργησε ένα σήμα για έναν νέο εργαζόμενο

Λόγω μιας ιδιορρυθμίας του υπολογιστικού συστήματος, οι νέοι εργαζόμενοι μερικές φορές δεν έχουν ακόμη ID όταν ξεκινούν να δουλεύουν στο εργοστάσιο. Επειδή τα σήματα είναι υποχρεωτικά, θα παίρνουν ένα προσωρινό σήμα χωρίς το πρόθεμα του ID.

Επέκτεινε τη συνάρτηση print_name_badge. Όταν το ID λείπει, πρέπει να δημιουργεί ένα σήμα χωρίς αυτό.

julia> print_name_badge(missing, "Robert Johnson", "Procurement")
"Robert Johnson - PROCUREMENT"

3. Δημιούργησε ένα σήμα για τον ιδιοκτήτη

Ακόμη και ο ιδιοκτήτης του εργοστασίου πρέπει να φοράει σήμα συνέχεια. Ωστόσο, ο ιδιοκτήτης δεν έχει τμήμα και ποτέ δεν θα έχει: είναι πάνω από όλα τα τμήματα. Σε αυτή την περίπτωση, η ετικέτα πρέπει να επιστρέφει "OWNER" αντί για το όνομα του τμήματος.

Επέκτεινε τη συνάρτηση print_name_badge. Όταν το τμήμα είναι nothing, υπέθεσε ότι το σήμα ανήκει στον ιδιοκτήτη της εταιρείας.

julia> print_name_badge(204, "Rachel Miller", nothing)
"[204] - Rachel Miller - OWNER"

Σημείωσε ότι είναι πιθανό ο ιδιοκτήτης να είναι και νέος εργαζόμενος.

julia> print_name_badge(missing, "Rachel Miller", nothing)
"Rachel Miller - OWNER"

4. Υπολόγισε τον συνολικό μισθό των εργαζομένων χωρίς ID

Ως μια χονδρική ένδειξη του πόσο καλά εκδίδονται τα ID, θέλεις να βλέπεις τον συνολικό μισθό των εργαζομένων χωρίς ID. Μια υψηλή τιμή σημαίνει ότι πολλοί περιμένουν, ή ότι το πρόβλημα αφορά πιο έμπειρους εργαζόμενους: και τα δύο είναι κακά.

Υλοποίησε τη συνάρτηση salaries_no_id που δέχεται ένα διάνυσμα με ID και ένα αντίστοιχο διάνυσμα με μισθούς, και επιστρέφει το άθροισμα των μισθών των ατόμων που δεν έχουν ακόμη ID. Και τα δύο διανύσματα έχουν το ίδιο μήκος.

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
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Julia Exercism

Έτοιμος να ξεκινήσεις την άσκηση Κονκάρδες ονόματος;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Julia με 35 έννοιες128 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.