PYTHON ΜΑΘΗΜΑ 17 – Tuples

 

Δωρεάν Μαθήματα Python


INTRODUCTION

Στο σημερινό δωρεάν μάθημα Python, ανοίγουμε ένα νέο κεφάλαιο στις δομές δεδομένων και αναλύουμε τα Tuples (Πλειάδες).

Θα δούμε αναλυτικά τι ακριβώς είναι, ποια είναι η βασική τους διαφορά από τις γνωστές μας λίστες (Lists) και, το κυριότερο, σε ποιες συγκεκριμένες περιπτώσεις είναι προτιμότερο –ή και απαραίτητο– να τα χρησιμοποιούμε στον κώδικά μας!

Πώς δημιουργούμε Tuples

Πριν προχωρήσουμε στην πραγματική αξία των Tuples, ας δούμε πώς ακριβώς δημιουργούνται και πώς συγκρίνονται οπτικά με τα Lists.

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

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

Δωρεάν Μαθήματα Python


Ποια είναι η διαφορά μεταξύ Tuple και List

Εκ πρώτης όψεως, τα lists και τα tuples φαίνονται να έχουν ακριβώς την ίδια συμπεριφορά. Όμως, αν «σκάψουμε» λίγο πιο βαθιά και κοιτάξουμε τις διαθέσιμες μεθόδους (methods) του κάθε data structure ξεχωριστά, θα παρατηρήσουμε κάτι πολύ ενδιαφέρον: το tuple περιέχει αισθητά λιγότερες μεθόδους απ' ό,τι το 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

Δωρεάν Μαθήματα Python


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

Η δεύτερη και πολύ κρίσιμη διαφορά κρύβεται στη διαχείριση της μνήμης: τα lists δεσμεύουν αισθητά περισσότερη μνήμη κατά τη δημιουργία τους απ' ό,τι τα tuples. Σε ένα μικρό πρόγραμμα, αυτό ίσως να περάσει απαρατήρητο. Αν όμως φτιάχνουμε μια εφαρμογή που κάνει ένα αίτημα σε μια βάση δεδομένων και "τραβάει" χιλιάδες εγγραφές (records), η σπατάλη μνήμης από ένα list θα είναι τεράστια! Γι' αυτόν τον λόγο, τα tuples είναι η απόλυτη επιλογή σε τέτοιες περιπτώσεις.

Για να το αποδείξουμε αυτό στην πράξη, θα χρησιμοποιήσουμε κάτι νέο: το sys module. Ακόμα δεν έχουμε μιλήσει για modules (βιβλιοθήκες), οπότε μην ανησυχείτε αν δεν καταλαβαίνετε απόλυτα τον κώδικα. Το μόνο που πρέπει να κρατήσετε εδώ, είναι ότι το sys μάς προσφέρει τη συνάρτηση 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

Δωρεάν Μαθήματα Python


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

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

Μην επικεντρωθείτε τόσο στο πώς χρησιμοποιούμε τα modules και πώς καλούμε τις συναρτήσεις τους. Θα μιλήσουμε αναλυτικά για αυτά σε μελλοντικές ενότητες. Το "χρυσό" στοιχείο που είναι χρήσιμο να κρατήσετε τώρα είναι το εξής: όταν γνωρίζουμε ότι τα δεδομένα μας δεν πρόκειται να αλλάξουν στο μέλλον, είναι πάντα προτιμότερο να τα ομαδοποιούμε σε ένα 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

Δωρεάν Μαθήματα Python


Πώς δημιουργούμε ένα Tuple

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

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

Υπάρχει όμως και ένας ακόμα πιο γρήγορος τρόπος: να ορίσουμε τα στοιχεία εντελώς χωρίς παρενθέσεις!

Η μόνη, αλλά απολύτως απαραίτητη προϋπόθεση σε αυτόν τον τρόπο δημιουργίας του tuple, είναι ότι τα δεδομένα μας πρέπει να χωρίζονται μεταξύ τους με κόμμα (,). Στην ορολογία της Python, αυτή η "έξυπνη" διαδικασία ονομάζεται Tuple Packing (πακετάρισμα).

app.py

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

Output

Δωρεάν Μαθήματα Python


Πώς αποκτούμε πρόσβαση στα στοιχεία ενός Tuple

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

app.py

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

Output

Δωρεάν Μαθήματα Python


Υπάρχει, ωστόσο, και μια δεύτερη μέθοδος που αυτοματοποιεί πλήρως τη διαδικασία ανάθεσης των στοιχείων (elements) ενός tuple σε μεταβλητές. Στην ορολογία της Python, αυτό ονομάζεται Unpacking.

Το μοναδικό σημείο που θα πρέπει να προσέξετε ιδιαίτερα εδώ, είναι ο «χρυσός» κανόνας του Unpacking: ο αριθμός των μεταβλητών που θα δηλώσετε πρέπει να είναι ακριβώς ο ίδιος με τον αριθμό των στοιχείων που περιέχει το tuple. Ειδάλλως, η Python θα παραπονεθεί και θα λάβετε μήνυμα λάθους (error)!

app.py

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

Output

Δωρεάν Μαθήματα Python


Tuples ως Κλειδιά (Keys) σε ένα Dictionary

Ένα από τα πιο ισχυρά χαρακτηριστικά των tuples είναι ότι μπορείτε να τα χρησιμοποιήσετε ως κλειδιά (keys) μέσα σε ένα Dictionary, κάτι που η Python απαγορεύει αυστηρά να κάνετε με τα lists! Αυτό συμβαίνει ακριβώς επειδή τα tuples είναι αμετάβλητα (immutable).

Ας δούμε ένα πολύ πρακτικό παράδειγμα: έστω ότι θέλετε να αποθηκεύσετε τοποθεσίες σε έναν χάρτη. Μπορείτε να χρησιμοποιήσετε ένα tuple με τις συντεταγμένες (γεωγραφικό πλάτος και μήκος) ως key, και το όνομα της τοποθεσίας ως 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


Δωρεάν Μαθήματα Python


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

Ένα κλασικό παράδειγμα, που μάλιστα είδαμε στο προηγούμενο μάθημα, είναι η μέθοδος items() των Dictionaries. Όταν της ζητάμε να μας φέρει τα ζευγάρια, μας τα επιστρέφει "πακεταρισμένα" με ασφάλεια μέσα σε tuples!

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

Δωρεάν Μαθήματα Python


Μετατροπή από List σε Tuple (και αντίστροφα)

Επίσης, θα ήταν πολύ χρήσιμο σε αυτό το σημείο να απαντήσουμε σε μια συχνή ερώτηση που έχουν όλοι όσοι συναντούν την έννοια του tuple και του list για πρώτη φορά: «Υπάρχει τρόπος να μετατρέψουμε ένα list σε tuple και το αντίστροφο;»

Η απάντηση είναι ένα ξεκάθαρο «ναι»! Η Python μάς δίνει τη δυνατότητα να κάνουμε αυτή τη μετατροπή (type casting) πανεύκολα, χρησιμοποιώντας απλώς τις ενσωματωμένες συναρτήσεις (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

Δωρεάν Μαθήματα Python


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

full-width

Post a Comment

0 Comments