Ένας κεντρικός στόχος της Julia είναι να μπορεί να εκτελεί υπολογισμούς σε αριθμητικά δεδομένα, γρήγορα και αποδοτικά. Πάρα πολλά αριθμητικά δεδομένα.
Συνήθως, τα δεδομένα αποθηκεύονται σε πίνακες (ή σε κάποιον συναφή τύπο), οπότε είναι λογικό να πούμε ότι οι πίνακες βρίσκονται στην καρδιά της γλώσσας Julia.
Οι πίνακες μπορούν να έχουν αυθαίρετο μέγεθος (με μόνο περιορισμό τη μνήμη του υλικού σου) και αυθαίρετα πολλές διαστάσεις.
Αυτή η εισαγωγική έννοια επικεντρώνεται στα βασικά των μονοδιάστατων πινάκων, που ονομάζονται Vector.
Στη Julia, ένα Vector είναι μια διατεταγμένη ακολουθία τιμών, στις οποίες μπορείς να έχεις πρόσβαση με αριθμό θέσης.
Ο απλούστερος τρόπος για να δημιουργήσεις ένα Vector είναι να απαριθμήσεις τις τιμές μέσα σε αγκύλες:
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"
Ο τύπος Vector ταιριάζει με τον τύπο κάθε στοιχείου.
Άρα τα Vector πρέπει να είναι ομογενή (όλα τα στοιχεία ίδιου τύπου);
Σε κάποιο βαθμό, ναι, και συνιστάται να το επιδιώκεις αυτό, αν θέλεις την καλύτερη απόδοση.
Ωστόσο, η Julia μπορεί να παρακάμψει αυτόν τον περιορισμό (όταν χρειάζεται) χρησιμοποιώντας τον τύπο Any:
julia> mixed_vector = [1, "str", 'c']
3-element Vector{Any}:
1
"str"
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
Όταν δημιουργείς ένα κενό Vector, η Julia χρησιμοποιεί από προεπιλογή τον τύπο στοιχείου Any, αλλά αυτό μπορεί να οριστεί πιο συγκεκριμένα, δηλώνοντας τον κενό πίνακα με τον επιθυμητό τύπο στοιχείου.
julia> empty_vec = []
Any[]
julia> empty_int_vec = Int64[]
Int64[]
Διάβασε και θυμήσου αυτόν τον κανόνα:
Αυτό είναι οικείο σε όποιον έχει χρησιμοποιήσει άλλες γλώσσες επιστήμης δεδομένων (R, Matlab, Fortran...), αλλά μπορεί να φαίνεται σοκαριστικό σε επιστήμονες υπολογιστών με υπόβαθρο σε γλώσσες τύπου C.
Κατά τα άλλα, οι θέσεις λειτουργούν όπως ίσως μαντεύεις: απλώς βάλ' τες μέσα σε αγκύλες:
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))
Πρόσεξε την ευκολία της προσπέλασης με end (που είναι πολύ χρήσιμη) και begin (που μάλλον δεν είναι).
Οι προγραμματιστές Python ίσως αναρωτιούνται για τις αρνητικές θέσεις.
Μην το κάνεις: δεν υπάρχουν στη Julia και θα πετάξουν ένα BoundsError, όπως και οποιαδήποτε θέση μικρότερη από το 1 ή μεγαλύτερη από το length(squares).
Τα Vector στη Julia είναι μεταβλητά: μπορούμε να αλλάξουμε το περιεχόμενο μεμονωμένων κελιών.
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
Υπάρχουν πολλές συναρτήσεις διαθέσιμες για τον χειρισμό Vector, αν και η τεκμηρίωση της Julia τις γενικεύει σε "συλλογές" αντί για Vector.
Σημείωσε ότι, κατά σύμβαση, οι συναρτήσεις που μεταβάλλουν το όρισμά τους έχουν ! στο όνομά τους.
Ο μεταγλωττιστής δεν θα το επιβάλει, αλλά είναι μια πολύ ισχυρή σύμβαση στον κόσμο της Julia.
Αυτές είναι μερικές από τις χρήσιμες συναρτήσεις:
push!().pop!().pushfirst!() και popfirst!().insert!() και 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
Ως επίδοξη μάγισσα, η Elyse χρειάζεται να εξασκηθεί σε μερικά βασικά. Έχει μια στοίβα κάρτες που θέλει να χειριστεί.
Για να τα κάνει λίγο πιο εύκολα, χρησιμοποιεί μόνο τις κάρτες 1 έως 10, ώστε η στοίβα με τις κάρτες της να μπορεί να αναπαρασταθεί με ένα διάνυσμα αριθμών. Η θέση μιας συγκεκριμένης κάρτας αντιστοιχεί στη θέση της μέσα στο διάνυσμα.
Για να διαλέξεις μια κάρτα, επέστρεψε την κάρτα στη θέση position από τη στοίβα που σου δίνεται.
julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> get_item(stack, position)
4
Κάνε ένα ταχυδακτυλουργικό κόλπο και αντάλλαξε την κάρτα στη θέση position με την κάρτα αντικατάστασης που σου δίνεται.
Επέστρεψε τη στοίβα με τις αλλαγές.
julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> replacement_card = 6;
julia> set_item!(stack, position, replacement_card)
[1, 2, 6, 1]
Κάνε μια κάρτα να εμφανιστεί βάζοντας μια νέα κάρτα στην κορυφή της στοίβας. Επέστρεψε τη στοίβα με τις αλλαγές.
julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_top!(stack, new_card)
[5, 9, 7, 1, 8]
Κάνε μια κάρτα να εξαφανιστεί αφαιρώντας την κάρτα στη θέση position από τη στοίβα.
Επέστρεψε τη στοίβα με τις αλλαγές.
julia> stack = [3, 2, 6, 4, 8];
julia> position = 3;
julia> remove_item!(stack, position)
[3, 2, 4, 8]
Κάνε μια κάρτα να εξαφανιστεί αφαιρώντας την κάρτα στην κορυφή της στοίβας. Επέστρεψε τη στοίβα με τις αλλαγές.
julia> stack = [3, 2, 6, 4, 8];
julia> remove_item_from_top!(stack)
[3, 2, 6, 4]
Κάνε μια κάρτα να εμφανιστεί βάζοντας μια νέα κάρτα στο κάτω μέρος της στοίβας. Επέστρεψε τη στοίβα με τις αλλαγές.
julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_bottom!(stack, new_card)
[8, 5, 9, 7, 1]
Κάνε μια κάρτα να εξαφανιστεί αφαιρώντας την κάρτα στο κάτω μέρος της στοίβας. Επέστρεψε τη στοίβα με τις αλλαγές.
julia> stack = [8, 5, 9, 7, 1];
julia> remove_item_at_bottom!(stack)
[5, 9, 7, 1]
Έλεγξε αν το μέγεθος της στοίβας είναι ίσο με stack_size ή όχι.
julia> stack = [3, 2, 6, 4, 8];
julia> stack_size = 4;
julia> check_size_of_stack(stack, stack_size)
false
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Julia με 35 έννοιες128 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.