PYTHON ΕΝΟΤΗΤΑ 16 – Tuples

 



ΕΙΣΑΓΩΓΗ

Στο σημερινό δωρεάν μάθημα Python θα δούμε αναλυτικά τα tuples, ποια είναι η διαφορά τους από τα lists και σε ποιες περιπτώσεις κώδικα είναι καλύτερα να τα χρησιμοποιήσουμε.

HOW TO CREATE TUPLES

Πριν δούμε την πραγματική αξία των tuples ας δούμε πως δημιουργούνται και πως συγκρίνονται με τα lists.

Για να δηλώσουμε ένα list, όπως ήδη έχουμε αναφέρει σε προηγούμενο δωρεάν μάθημα Python, χρησιμοποιούμε square brackets ( [ ] ), ενώ για να δημιουργήσουμε ένα tuple χρησιμοποιούμε parentheses ( ( ) ).

app.py

premier_league1 = ['Arsenal', 'Burnley', 'Everton', 'Aston Villa']

for team in premier_league1:
    print(team)

print('*' * 80)

premier_league2 = ('Arsenal', 'Burnley', 'Everton', 'Aston Villa')

for team in premier_league2:
    print(team)

Output

Arsenal
Burnley
Everton
Aston Villa
********************************************************************************
Arsenal
Burnley
Everton
Aston Villa


WHAT IS THE DIFFERENCE BETWEEN TUPLE AND LIST

Οπτικά τα lists και τα tuples φαίνονται να έχουν την ίδια συμπεριφορά. Όμως αν κοιτάξουμε καλύτερα τις μεθόδους του κάθε data structure ξεχωριστά θα δούμε ότι το tuple περιέχει λιγότερες methods από ότι το list. Ας το επιβεβαιώσουμε αυτό το στοιχείο πριν προχωρήσουμε στην επόμενη διαφορά.

app.py

premier_league1 = ['Arsenal', 'Burnley', 'Everton', 'Aston Villa']
print("List methods")
print(dir(premier_league1))

print('*' * 80)

premier_league2 = ('Arsenal', 'Burnley', 'Everton', 'Aston Villa')
print("Tuple methods")
print(dir(premier_league2))

Output

List methods
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
********************************************************************************
Tuple methods
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']


Βλέπετε από το παραπάνω output του κώδικα μας, ότι μια ομάδα από methods που υπάρχουν στα lists δεν υπάρχουν στα tuples. Αυτή είναι και η πρώτη διαφορά τους.

Η δεύτερη διαφορά που υπάρχει ανάμεσα σε lists και tuples είναι ότι τα lists δεσμεύουν περισσότερη μνήμη όταν δημιουργούνται από ότι τα tuples. Σε ένα πρόγραμμα με μικρό αριθμό δεδομένων αυτό ίσως να μην είναι και πολύ σημαντική διαφορά. Αλλά σε ένα πρόγραμμα που κάνει ένα αίτημα σε μια βάση δεδομένων και το αποτέλεσμα που θα πρέπει να αποθηκεύσουμε πίσω στο κώδικα μας είναι αρκετές χιλιάδες records, τότε σίγουρα η χρήση της μνήμης θα είναι αρκετά μεγάλη. Για αυτό το λόγο το tuple είναι η πρώτη μας επιλογή σε μια τέτοια περίπτωση. Ας αποδείξουμε όμως ότι πραγματικά τα δύο αυτά data structures δεσμεύουν διαφορετικό αριθμό μνήμης κατά την δημιουργία τους. Για αυτό το σκοπό πρέπει να χρησιμοποιήσουμε το sys module. Ακόμα δεν έχουμε μιλήσει για modules οπότε δεν πειράζει αν δεν καταλαβαίνετε απόλυτα τον κώδικα. Αυτό που έχει σημασία είναι ότι το sys module περιέχει την function getsizeof( ) που μας επιστρέφει σαν αποτέλεσμα την ποσότητα της μνήμης που απασχολεί το συγκεκριμένο αντικείμενο.

app.py

import sys

premier_league1 = ['Arsenal', 'Burnley', 'Everton', 'Aston Villa']
print("List Size")
print(sys.getsizeof(premier_league1))

print('*' * 80)

premier_league2 = ('Arsenal', 'Burnley', 'Everton', 'Aston Villa')
print("Tuple Size")
print(sys.getsizeof(premier_league2))

Output

List Size
120
********************************************************************************
Tuple Size
72


Η τρίτη μεγάλη διαφορά που υπάρχει ανάμεσα στα lists και στα tuples είναι ότι τα tuples είναι immutable – δηλαδή από τη στιγμή που θα δημιουργηθούν δεν μπορούμε να κάνουμε καμία αλλαγή στα δεδομένα τους. Αυτό είναι λογικό από την στιγμή που δεν υπάρχουν methods όπως pop( ) και insert( ) όπως είχαμε στα lists.

Η τέταρτη μεγάλη διαφορά είναι ότι τα tuples δημιουργούνται πολύ πιο γρήγορα από ότι τα lists στην μνήμη του υπολογιστή. Αυτό μπορούμε να το δούμε αν κάνουμε import το timeit module στο πρόγραμμα μας και καλέσουμε την function timeit( ). Το timeit( ) function δέχεται σαν πρώτη παράμετρο (stmt) τα στοιχεία που θέλουμε να δημιουργήσουμε, και σαν δεύτερη παράμετρο (number) την πράξη που θέλουμε να εκτελέσουμε που στην ουσία είναι να χρησιμοποιήσουμε τα στοιχεία 1,000,000 φορές.

Μην συγκεντρωθείτε τόσο στο πως χρησιμοποιούμε τα modules και πως καλούμε τα functions που μας προσφέρουν. Θα μιλήσουμε για αυτά σε μελλοντικές ενότητες. Αυτό που είναι χρήσιμο να κρατήσετε τώρα είναι το γεγονός ότι σε εκείνες τις περιπτώσεις που ξέρουμε ότι τα δεδομένα δεν θα αλλάξουν είναι προτιμότερο να τα ομαδοποιήσουμε σε ένα tuple παρά σε ένα list.

app.py

import timeit

list_time_creation = timeit.timeit(stmt="['Arsenal', 'Burnley', "
                                        "'Everton', 'Aston Villa']",
                                   number=1000000)

tuple_time_creation = timeit.timeit(stmt="('Arsenal', 'Burnley', "
                                         "'Everton', 'Aston Villa')",
                                    number=1000000)

print("List time creation", list_time_creation)
print('*' * 80)
print("Tuple time creation", tuple_time_creation)

Output

List time creation 0.07891479998943396
********************************************************************************
Tuple time creation 0.013066499988781288

ΗOW TO CREATE A TUPLE

Ξεκινώντας το σημερινό δωρεάν μάθημα Python, είδαμε πως μπορούμε να δημιουργήσουμε ένα tuple – απλά βάζοντας τα δεδομένα μας μέσα σε μια παρένθεση.

premier_league2 = ('Arsenal', 'Burnley', 'Everton', 'Aston Villa')

 

Υπάρχει όμως και ένας πιο γρήγορος τρόπος και αυτός είναι να ορίσουμε τα στοιχεία χωρίς παρένθεση. Η απαραίτητη προϋπόθεση σε αυτό τον τρόπο δημιουργίας του tuple είναι ότι τα δεδομένα πρέπει να χωρίζονται με κόμμα.

app.py

premier_league = 'Arsenal', 'Burnley', 'Everton', 'Aston Villa'
print(premier_league)
print(type(premier_league))

Output

('Arsenal', 'Burnley', 'Everton', 'Aston Villa')
<class 'tuple'>

HOW TO ACCESS ELEMENTS IN TUPLE

Όπως και στα lists έτσι και στα tuples ο τρόπος για να αποκτήσουμε πρόσβαση σε κάθε στοιχείο του tuple είναι με τη χρήση του index.

app.py

premier_league = 'Arsenal', 'Burnley', 'Everton', 'Aston Villa'
team1 = premier_league[0]
print(team1)

Output

Arsenal

Υπάρχει και ένας δεύτερος τρόπος που αυτοματοποιεί τον τρόπο ανάθεσης των elements ενός tuple σε μεταβλητές. Το σημείο που θα πρέπει να προσέξετε είναι ότι ο αριθμός των μεταβλητών πρέπει να είναι ακριβώς ο ίδιος με τον αριθμό των elements ειδάλλως θα λάβετε error από την Python.

app.py

premier_league = 'Arsenal', 'Burnley', 'Everton', 'Aston Villa'
team1, team2, team3, team4 = premier_league
print(team1)
print(team2)
print(team3)
print(team4)

Output

Arsenal
Burnley
Everton
Aston Villa

TUPLES AS KEYS IN A DICTIONARY

Μπορείτε επίσης να χρησιμοποιήσετε τα tuples σαν keys σε ένα dictionary κάτι που δεν επιτρέπεται από την Python με lists.

Ας υποθέσουμε ότι έχετε σαν keys τις συντεταγμένες μιας τοποθεσίας και σαν value το όνομα της τοποθεσίας.

app.py

locations = {
    (33.6895, 39.6917): "Tokyo Office",
    (40.7128, 74.0060): "New York Office",
    (37.7749, 122.4129): "San Fransisco Office"
}

print(locations[(33.6895, 39.6917)])

Output


Tokyo Office

Πριν κλείσουμε το σημερινό δωρεάν μάθημα Python θα ήθελα να σας αναφέρω το γεγονός ότι πολλά functions και methods που χρησιμοποιούμε στην Python επιστρέφουν tuple σαν τιμή. Για παράδειγμα το method items( ) από ένα dictionary.

app.py

locations = {
    (33.6895, 39.6917): "Tokyo Office",
    (40.7128, 74.0060): "New York Office",
    (37.7749, 122.4129): "San Fransisco Office"
}

print(locations.items())

Output

dict_items([((33.6895, 39.6917), 'Tokyo Office'), ((40.7128, 74.006), 'New York Office'), ((37.7749, 122.4129), 'San Fransisco Office')])

Επίσης θα ήταν χρήσιμο να απαντήσουμε σε μια συχνή ερώτηση που ρωτάνε όλοι όσοι συναντάνε την έννοια του tuple και του list για πρώτη φορά – υπάρχει τρόπος να μετατρέψουμε ένα list σε tuple και το αντίστροφο? Και η απάντηση είναι ναι με τη χρήση των functions tuple( ) και list( ) αντίστοιχα.

app.py

premier_league_list = ['Arsenal', 'Burnley', 'Everton', 'Aston Villa']
premier_league_tuple = tuple(premier_league_list)
print(premier_league_tuple)

premier_league_list_new = list(premier_league_tuple)
print(premier_league_list_new)

Output

('Arsenal', 'Burnley', 'Everton', 'Aston Villa')
['Arsenal', 'Burnley', 'Everton', 'Aston Villa']


Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το site να μεγαλώσει ακόμα πιο πολύ και να αποκτήσει περισσότερες δυνατότητες online παράδοσης δωρεάν μαθημάτων.

full-width

Post a Comment

0 Comments