Πολύ συχνά θα κληθούμε να χειριστούμε δεδομένα στα προγράμματά μας σε μορφή κειμένου. Έχουμε χρησιμοποιήσει στα μαθήματά μας ως τώρα string διαφόρων μεγεθών και γνωρίζουμε πώς γίνονται λειτουργίες όπως η συνένωση και ο πολλαπλασιασμός. Μπορούμε όμως, όπως θα δούμε σήμερα, να κάνουμε πολλά παραπάνω με τα string στον κώδικά μας.
Προτάσεις συνεργασίας
Τα νέα άρθρα του PCsteps
Γίνε VIP μέλος στο PCSteps
Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.
Πάμε να δούμε μερικούς από τους τρόπους που μας παρέχει η Python, προκειμένου να γράψουμε, να τυπώσουμε, και γενικότερα να χειριστούμε τα string στον κώδικά μας
Εισαγωγικά
Έχουμε δει μέχρι τώρα πόσο απλό είναι να δημιουργήσουμε ένα string στην Python. Γράφουμε τους χαρακτήρες που θέλουμε (γράμματα – αριθμούς – σύμβολα) εντός απλών εισαγωγικών – quotes(‘ ‘). Τι γίνεται όμως αν θελήσουμε να χρησιμοποιήσουμε το μονό εισαγωγικό μέσα στο string μας?
Στην περίπτωση αυτή, αλλά και γενικά για όποιον το προτιμά, μπορούμε να χρησιμοποιήσουμε διπλά εισαγωγικά.
>>> var = "I'm learning python"
Με αυτόν τον τρόπο, η Python γνωρίζει ότι το μονό εισαγωγικό είναι μέρος του string. Ωστόσο, αν θέλουμε να χρησιμοποιήσουμε και διπλά εισαγωγικά στο string μας, θα έχουμε και πάλι πρόβλημα.
Χαρακτήρας escape
Η γενικότερη λύση που μας βοηθάει να χρησιμοποιούμε χαρακτήρες τους οποίους διαφορετικά δεν επιτρέπεται, είναι ο χαρακτήρας escape.
To escape αποτελείται από την αντίστροφη κάθετο, το backslash κοινώς (\), ακολουθούμενη από τον χαρακτήρα που επιθυμούμε να εισάγουμε στο string.
Για παράδειγμα, για το μονό εισαγωγικό, ο χαρακτήρας escape είναι το \'. Για την προαναφερθείσα εντολή, θα γράφαμε:
>>> var = 'I\'m learning python.'
Παραθέτουμε έναν πίνακα με τους χαρακτήρες escape που έχουμε στη διάθεσή μας:
Ας δούμε μερικούς στην πράξη στον IDLE:
Raw string (Πηγαίο string)
Τοποθετώντας ένα r πριν το πρώτο εισαγωγικό ενός string, το μετατρέπουμε σε raw (πηγαίο) string. Το raw string αγνοεί όλους τους χαρακτήρες escape που περιέχει το string, και εκτυπώνει ό,τι backslash υπάρχουν. Για παράδειγμα:
>>> print(r'I\'m learning python.') I\'m learning python.
Ίσως αναρωτηθεί κανείς, γιατί χρειαζόμαστε τέτοιου είδους string? Συχνά στον κώδικά μας θα χειριστούμε string που περιέχουν πολλά backslash και, όπως θα δούμε, σε τέτοιες περιπτώσεις τα raw string θα μας φανούν χρήσιμα.
Multiline string
Παρότι μπορούμε να αλλάξουμε σειρά με τον χαρακτήρα escape newline (\n), καμιά φορά είναι πιο εύκολο να χρησιμοποιήσουμε string πολλαπλών σειρών (multiline). Ένα τέτοιο string αρχίζει και τελειώνει με τρία διαδοχικά (μονά ή διπλά) εισαγωγικά.
Η μεγάλη διαφορά τους είναι ότι τα οποιαδήποτε εισαγωγικά, tab, ή αλλαγές γραμμής περιέχουν, θεωρούνται μέρος του string. Οι κανόνες στοίχισης της Python για τα block δεν εφαρμόζονται σε γραμμές μέσα σε ένα multiline string.
Για παράδειγμα γράφουμε σε έναν editor:
Η εκτύπωση θα είναι η εξής:
Βλέπουμε ότι η απόστροφος που περιλαμβάνεται στο string δεν χρειάζεται escape.
Multiline σχόλια
Μέχρι τώρα γνωρίζουμε πώς να εισάγουμε σχόλια στον κώδικά μας με τη χρήση του hashtag (#). Ο χαρακτήρας αυτός σηματοδοτεί την έναρξη ενός σχολίου για όλη την υπόλοιπη γραμμή. Σε περίπτωση που θέλουμε ένα σχόλιο να εκτείνεται σε περισσότερες από μία σειρές, θα χρησιμοποιήσουμε τρία διαδοχικά διπλά εισαγωγικά.
Ο παρακάτω κώδικας, παραδείγματος χάριν, είναι απόλυτα έγκυρος:
def fun(): """ This is a multiline comment to see what fun() function does.""" print('Hi')
Δείκτες και slice σε string
Μπορούμε να χρησιμοποιήσουμε δείκτες και slice με τα string, όπως συμβαίνει και με τις λίστες. Μπορούμε να θεωρήσουμε το string ‘Hello world!' ως λίστα, και κάθε χαρακτήρα του ως αντικείμενο με τον αντίστοιχο δείκτη.
' H e l l o w o r l d ! ' 0 1 2 3 4 5 6 7 8 9 10 11
Μαζί με το κενό και το θαυμαστικό, το πλήθος των χαρακτήρων του string μας είναι 12. Γράφουμε λοιπόν στο διαδραστικό κέλυφος:
Όπως γνωρίζουμε και από τις λίστες, όταν θέλουμε να πάρουμε ένα slice (κομμάτι) του string, ο χαρακτήρας του πρώτου δείκτη περιλαμβάνεται στο string που θα επιστρέψει, ενώ του δεύτερου όχι.
Να σημειωθεί ότι το slicing δεν τροποποιεί το αρχικό string, μπορούμε όμως να αποθηκεύσουμε το slice σε ξεχωριστή μεταβλητή. Για παράδειγμα:
in και not in σε string
Μπορούμε να εκμεταλλευτούμε τους τελεστές in και not in και με τα string, με τρόπο όμοιο με τις λίστες. Οι εκφράσεις στις οποίες τα χρησιμοποιούμε, επιστρέφουν τιμή Boolean, True ή False.
Χρήσιμες μέθοδοι string
Υπάρχουν αρκετές μέθοδοι με τις οποίες αναλύουμε τα string, κάνουμε μετατροπές, δημιουργούμε καινούργια, κλπ. Ας δούμε τις πιο συνηθισμένες από αυτές.
upper(), lower(), isupper(), islower()
Για όσους θυμούνται το αντίστοιχο μάθημα, έχουμε κάνει ήδη μια αναφορά στην upper() για τις ανάγκες ενός προγράμματός μας.
Τόσο η upper(), όσο και η lower(), επιστρέφουν το string που τους περνάμε ως όρισμα, αφού μετατρέψουν όλους τους χαρακτήρες σε κεφαλαία ή μικρά, αντίστοιχα.
Οι μέθοδοι αυτοί δεν αλλάζουν το αρχικό string, αλλά επιστρέφουν ένα νέο. Γι' αυτό και θα πρέπει να χρησιμοποιήσουμε μεταβλητή για να το αποθηκεύσουμε:
message = message.upper()
Οι isupper() και islower() από την άλλη, επιστρέφουν True, αν το string περιέχει τουλάχιστον ένα γράμμα, και αν όλα τα γράμματα είναι κεφαλαία ή μικρά, αντίστοιχα. Διαφορετικά επιστρέφουν False.
Από τη στιγμή, μάλιστα, που οι upper() και lower() επιστρέφουν string, έχουμε τη δυνατότητα να καλέσουμε τέτοιες μεθόδους και στις επιστρεφόμενες τιμές τους.
Εκφράσεις που δημιουργούνται με αυτόν τον τρόπο θα μοιάζουν σαν μια αλυσίδα από κλήσεις μεθόδων:
Μέθοδοι is___()
Πέρα από τις isupper() και islower(), η Python διαθέτει αρκετές ακόμα μεθόδους string, που ξεκινούν με τη λέξη “is”. Και αυτές οι μέθοδοι, όπως θα δούμε, επιστρέφουν τιμές Boolean που περιγράφουν τη φύση του string.
Παρακάτω αναφέρουμε μερικά παραδείγματα:
- isalpha(): Επιστρέφει True, αν το string αποτελείται μόνο από γράμματα (και δεν είναι κενό).
- isalnum(): Επιστρέφει True, αν το string αποτελείται μόνο από γράμματα και αριθμούς (και δεν είναι κενό).
- isdecimal(): Επιστρέφει True, αν το string αποτελείται μόνο από αριθμητικούς χαρακτήρες (και δεν είναι κενό).
- isspace(): Επιστρέφει True, αν το string αποτελείται μόνο από κενά, tab, και χαρακτήρες newline (και δεν είναι κενό).
- istitle(): Επιστρέφει True, αν το string αποτελείται μόνο από λέξεις που ξεκινούν με κεφαλαίο γράμμα, και συνεχίζουν μόνο από μικρά (όπως ένας τίτλος).
Μέθοδοι σαν αυτές θα αποδειχθούν χρήσιμες όταν θέλουμε να επικυρώσουμε δεδομένα που εισάγει ο χρήστης. Για παράδειγμα, το ακόλουθο πρόγραμμα ελέγχει επανειλημμένα την ηλικία και τον κωδικό του χρήστη, μέχρι να βρει τα στοιχεία που δηλώνει, έγκυρα.
Μόλις εκτελεστεί, το πρόγραμμα θα τυπώσει τα ακόλουθα:
startswith() και endswith()
Οι μέθοδοι startswith() και endswith() επιστρέφουν True, αν το string που τους δίνουμε ξεκινάει ή τελειώνει – αντίστοιχα – με το string από το οποίο τις καλούμε. Θα το δούμε καλύτερα με ένα παράδειγμα:
join() και split()
Η join() είναι χρήσιμη αν έχουμε μια λίστα από string που πρέπει να συνενωθούν σε ένα ενιαίο. Καλούμε την join() σε string, της περνάμε μια λίστα από string, και επιστρέφει το string που αποτελεί τη συνένωση των αρχικών.
Παρατηρούμε ότι το τελικό string συνενώνει τα string-ορίσματα, αφού προηγουμένως τοποθετήσει ανάμεσά τους το string στο οποίο έγινε η κλήση.
Η split(), από προεπιλογή, θα κόψει το string του παραδείγματος οπουδήποτε βρει κενό χαρακτήρα: tab, κενό, ή newline. Οι χαρακτήρες αυτοί δεν συμπεριλαμβάνονται στο επιστρεφόμενο string.
Μπορούμε να περάσουμε στην μέθοδο και ένα string οριοθέτησης, αν θέλουμε να προσδιορίσουμε διαφορετική διάσπαση του αρχικού.
Η split() βρίσκει συχνή χρήση όταν θέλουμε να διαχωρίσουμε ένα multiline string στα επιμέρους string κάθε σειράς. Στην περίπτωση αυτή, θα γράφαμε:
>>> multiline_string.split('\n')
Στοίχιση κειμένου – rjust(), ljust(), center()
Οι rjust() και ljust() επιστρέφουν το string στο οποίο καλούνται, αφού εισάγουν μπροστά κενό για να στοιχίσουν το κείμενο. Το πρώτο όρισμά τους είναι ένας ακέραιος που ορίζει το μήκος της εσοχής.
Η ‘Hello'.rjust(10) λέει ότι θέλουμε να στοιχίσουμε δεξιά το string ‘Hello', με το συνολικό string να είναι δέκα θέσεων. Εφόσον το string μας είναι μήκους πέντε θέσεων, το τελικό θα έχει άλλες πέντε κενές θέσεις ως αριστερή εσοχή.
Προαιρετικά οι rjust() και ljust() παίρνουν ως δεύτερο όρισμα τον χαρακτήρα γεμίσματος, αν επιθυμούμε κάτι διαφορετικό από το κενό:
Τέλος, η center() δουλεύει όπως και οι δυο άλλες μέθοδοι, με τη διαφορά ότι τοποθετεί το αρχικό string στο μέσον του συνολικού:
Οι μέθοδοι της ενότητας αυτής αποδεικνύονται πολύτιμες, όταν θέλουμε να τυπώσουμε δεδομένα υπό μορφή πίνακα με την κατάλληλη στοίχιση. Ας γράψουμε το ακόλουθο πρόγραμμα:
Θέλουμε να οργανώσουμε τα δεδομένα της picnic_food σε δύο στήλες, με το όνομα κάθε αντικειμένου αριστερά και την ποσότητα δεξιά.
Γι' αυτόν τον λόγο κατασκευάζουμε μια συνάρτηση, την print_picnic(). Στη συνάρτηση, εκτός από το λεξικό όπου έχουμε αποθηκευμένα τα αντικείμενά μας, περνάμε ως ορίσματα το εύρος της κάθε στήλης.
Το αποτέλεσμα της εκτύπωσης είναι το εξής:
Διαγραφή κενών – strip(), rstrip(), lstrip()
Μερικές φορές θέλουμε να κάνουμε το αντίστροφο: να αφαιρέσουμε χαρακτήρες κενού (κενό, tab, newline), είτε αριστερά, είτε δεξιά, είτε και από τις δύο πλευρές ενός string.
Η μέθοδος strip() θα επιστρέψει ένα νέο string, έχοντας αφαιρέσει τυχόν κενά πριν ή μετά το string. Οι lstrip() και rstrip() θα διαγράψουν κενούς χαρακτήρες από το αριστερό και το δεξί άκρο αντίστοιχα.
Σε παρόμοιο σκεπτικό με τις rjust(), ljust(), center() της προηγούμενης ενότητας, ένα προαιρετικό όρισμα-string θα καθορίσει ποιοι χαρακτήρες θα αποκοπούν στα άκρα. Γράφουμε στον IDLE:
Περνώντας στη strip() το όρισμα ‘nhoJ', λέμε στη συνάρτηση να κόψει κάθε εμφάνιση των n, h, o, και J από τα άκρα του string message.
Η σειρά με την οποία περνάμε τους χαρακτήρες στη strip() δεν παίζει ρόλο: η strip(‘John') θα κάνει την ίδια δουλειά με τη strip(‘nhoJ') ή τη strip(‘hoJn'). Γι' αυτό και για το δεύτερο message, η strip() μας επιστρέφει το string ‘ell', και όχι το ‘hello', όπως ίσως περίμενε κανείς.
Στο επόμενο μάθημα για τον προγραμματισμό Python
Θα δούμε για πρώτη φορά πώς μπορούμε να γράψουμε project με αλληλεπίδραση με τον υπόλοιπο υπολογιστή, τρέχοντας το χωρίς τη χρήση του IDLE, αλλά από την κονσόλα των Windows.
Σας άρεσε το σημερινό μάθημα για τον προγραμματισμό Python?
Όπως σε κάθε μάθημα, περιμένουμε στα σχόλια για τυχόν προτάσεις και απορίες σας.
Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.