Μια πλειάδα είναι μια αμετάβλητη συλλογή στοιχείων σε ακολουθία.
Όπως οι περισσότερες συλλογές (δες τις ενσωματωμένες list, dict και set), οι tuples μπορούν να περιέχουν οποιονδήποτε (ή πολλαπλούς) τύπο δεδομένων, ακόμα και άλλες tuples.
Μπορείς να διατρέξεις τα στοιχεία μιας πλειάδας με τη δομή for item in <tuple>.
Αν χρειάζεσαι και τη θέση και την τιμή του στοιχείου, μπορείς να χρησιμοποιήσεις το for index, item in enumerate(<tuple>).
Όπως σε κάθε ακολουθία, μπορείς να προσπελάσεις τα στοιχεία μέσα σε tuples με συμβολισμό αγκυλών, χρησιμοποιώντας έναν αριθμό 0-based index από τα αριστερά ή έναν αριθμό -1-based index από τα δεξιά.
Οι πλειάδες μπορούν να αντιγραφούν ολόκληρες ή εν μέρει μέσω συμβολισμού τεμαχισμού ή με <tuple>.copy(), και υποστηρίζουν όλες τις κοινές πράξεις ακολουθιών.
Καθώς είναι αμετάβλητες, οι tuples δεν υποστηρίζουν πράξεις μεταβλητών ακολουθιών.
Οι πλειάδες καταλαμβάνουν πολύ λίγο χώρο στη μνήμη σε σύγκριση με άλλους τύπους συλλογών και έχουν σταθερό χρόνο πρόσβασης (O(1)) όταν χρησιμοποιείς θέση.
Ωστόσο, δεν μπορούν να αλλάξουν μέγεθος, να ταξινομηθούν ή να τροποποιηθούν αφού δημιουργηθούν, οπότε είναι λιγότερο ευέλικτες όταν χρειάζονται συχνές αλλαγές ή ενημερώσεις στα δεδομένα.
Αν απαιτούνται συχνές ενημερώσεις ή επεκτάσεις, μια list, ένα collections.deque ή ένα array.array μπορεί να είναι καλύτερη δομή δεδομένων.
Οι πλειάδες μπορούν να σχηματιστούν με πολλούς τρόπους, είτε με τον κατασκευαστή της κλάσης tuple είτε με τη δήλωση (<element_1>, <element_2>) (κυριολεκτικό tuple).
tuple() κενά ή με ένα iterable:>>> no_elements = tuple()
()
# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)
Οι συμβολοσειρές είναι iterable, οπότε η χρήση μιας μόνο str ως ορίσματος στον κατασκευαστή tuple() μπορεί να έχει απροσδόκητα αποτελέσματα:
# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')
Τα στοιχεία και άλλων iterable προστίθενται επίσης ένα ένα:
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Η προεπιλεγμένη επανάληψη για ένα dict γίνεται πάνω στα κλειδιά.
Για να συμπεριλάβεις και κλειδιά και τιμές σε μια πλειάδα που φτιάχνεις από ένα λεξικό, χρησιμοποίησε το <dict>.items(), το οποίο θα επιστρέψει έναν iterator από (key, value) tuples.
>>> source_data = {"fish": "gold", "monkey": "brown"}
>>> multiple_elements_dict_1 = tuple(source_data)
('fish', 'monkey')
>>> multiple_elements_dict_2 = tuple(source_data.items())
(('fish', 'gold'), ('monkey', 'brown'))
Επειδή ο κατασκευαστής tuple() δέχεται ως ορίσματα μόνο iterables (ή τίποτα), είναι πολύ πιο εύκολο να δημιουργήσεις μια πλειάδα με ένα στοιχείο μέσω της κυριολεκτικής μεθόδου.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
Σημείωσε ότι γενικά οι παρενθέσεις δεν απαιτούνται για να δημιουργήσεις ένα κυριολεκτικό tuple, μόνο τα κόμματα.
Ωστόσο, η χρήση του (<element_1>, <element_2>) θεωρείται πιο ευανάγνωστη στις περισσότερες περιπτώσεις.
Οι παρενθέσεις απαιτούνται επίσης σε περιπτώσεις ασάφειας, όπως μια κενή πλειάδα ή μια πλειάδα με ένα στοιχείο, ή όταν μια συνάρτηση δέχεται μια πλειάδα ως όρισμα.
>>> elements_separated_with_commas = "Parrot", "Bird", 334782
("Parrot", "Bird", 334782)
>>> elements_with_commas_and_parentheses = ("Triangle", 60, 60, 60)
("Triangle", 60, 60, 60)
Άλλες δομές δεδομένων μπορούν να συμπεριληφθούν ως στοιχεία tuple, ακόμα και άλλα tuples.
>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
Οι πλειάδες μπορούν να συνενωθούν με τον τελεστή συν +, ο οποίος αποσυσκευάζει κάθε tuple και δημιουργεί μια νέα, συνδυασμένη tuple.
>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("George", 5, "cat", "Tabby")
#likewise, using the multiplication operator * is the equivalent of using + n times
>>> first_group = ("cat", "dog", "elephant")
>>> multiplied_group = first_group * 3
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')
Τα στοιχεία μέσα στις πλειάδες (όπως στους άλλους τύπους ακολουθιών str και list), μπορείς να τα προσπελάσεις με συμβολισμό αγκυλών.
Οι θέσεις μπορούν να είναι από left --> right (ξεκινώντας από το μηδέν) ή από right --> left (ξεκινώντας από το -1).
Οι πλειάδες μπορούν επίσης να αντιγραφούν ολόκληρες ή εν μέρει μέσω συμβολισμού τεμαχισμού ή με <tuple>.copy().
>>> student_info = ("Alyssa", "grade 3", "female", 8)
#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa
>>> student_name = student_info[-4]
Alyssa
#age is at index 3 or index -1
>>> student_age_1 = student_info[3]
8
>>> student_age_2 = student_info[-1]
8
Μπορείς να διατρέξεις τα στοιχεία μέσα σε μια πλειάδα με έναν βρόχο χρησιμοποιώντας τη σύνταξη for item in <tuple>.
Αν χρειάζεσαι και τις θέσεις και τις τιμές, μπορείς να χρησιμοποιήσεις το for index, item in enumerate(<tuple>).
>>> student_info = ("Alyssa", "grade 3", "female", 8)
>>> for item in student_info:
... print(item)
...
Alyssa
grade 3
female
8
>>> for index, item in enumerate(student_info):
... print("Index is: " + str(index) + ", value is: " + str(item) + ".")
...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.
Οι πλειάδες χρησιμοποιούνται συχνά ως καταγραφές που περιέχουν δεδομένα οργανωτικά ή εννοιολογικά ομοιογενή και αντιμετωπίζονται ως μία μονάδα πληροφορίας, ακόμα και αν τα επιμέρους στοιχεία τους είναι ετερογενών τύπων δεδομένων.
>>> student_info = ("Alyssa", "grade 3", "female", 8)
Οι πλειάδες χρησιμοποιούνται επίσης όταν χρειάζονται ομοιογενείς αμετάβλητες ακολουθίες δεδομένων για hashability, για αποθήκευση σε ένα set ή για τη δημιουργία κλειδιών σε ένα λεξικό.
Σημείωσε ότι, ενώ οι tuples είναι στις περισσότερες περιπτώσεις αμετάβλητες, επειδή μπορούν να περιέχουν οποιαδήποτε δομή δεδομένων ή αντικείμενο, μπορούν να γίνουν μεταβλητές αν κάποιο από τα στοιχεία τους είναι μεταβλητού τύπου.
Η χρήση ενός μεταβλητού τύπου δεδομένων μέσα σε μια tuple θα κάνει την tuple που την περιέχει μη κατακερματίσιμη.
>>> cmyk_color_map = {
(.69, .3, .48, .1) : ("Teal 700", (59, 178, 146), 0x3BB292),
(0, .5, 1, 0) : ("Pantone 151", (247, 127, 1), 0xF77F01),
(.37, .89, 0, .44) : ("Pantone 267", (89, 16, 142), 0x59108E),
(0, 1, .46, .45) : ("Pantone 228", (140, 0, 76), 0x8C004C)
}
>>> unique_rgb_colors = {
(59, 178, 146),
(247, 127, 1),
(89, 16, 142),
(140, 0, 76),
(76, 0, 140)
}
>>> teal_700 = hash((59, 178, 146))
>>> teal_700 = hash(("Pantone 228", [(140, 0, 76), 0x8C004C]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Οι πλειάδες χρησιμοποιούνται συχνά ως καταγραφές, αλλά μπορείς να προσπελάσεις τα δεδομένα μέσα τους μόνο μέσω θέσης/σειράς.
Η κλάση namedtuple() στο module collections επεκτείνει τη βασική λειτουργικότητα των πλειάδων ώστε να επιτρέπει την πρόσβαση στα στοιχεία με όνομα.
Επιπλέον, μπορείς να προσαρμόσεις μια dataclass ώστε να παρέχει παρόμοια λειτουργικότητα ονομαστικών χαρακτηριστικών, με κάποια πλεονεκτήματα και μειονεκτήματα.