11. Συμβολοσειρές στην Python

Οι συμβολοσειρές είναι ένας τύπος δεδομένων της Python που ονομάζεται str. Οι υπόλοιποι είναι ο ακέραιος τύπος int, ο τύπος αριθμών κινητής υποδιαστολής float και ο λογικός τύπος bool. Οι συμβολοσειρές είναι ακολουθίες χαρακτήρων που αποτελούνται από αριθμούς, ψηφία, γράμματα και σύμβολα τα οποία περικλείονται σε μονά (‘ ‘) ή διπλά (“ “) εισαγωγικά.

 Τα μονά (‘ ‘) και τα διπλά (“ “) εισαγωγικά ορίζουν τον ίδιο τύπο αντικειμένου και επιφέρουν το ίδιο αποτέλεσμα. Οι συμβολοσειρές είναι αμετάβλητες, δηλαδή δεν μπορούμε να τις τροποποιήσουμε. Αν θέλουμε να τροποποιήσουμε μια συμβολοσειρά θα πρέπει να δημιουργήσουμε ένα νέο αντικείμενο συμβολοσειράς με την αλλαγμένη τιμή του. Μπορούμε να εισάγουμε μια συμβολοσειρά από το πληκτρολόγιο με την εντολή input και να την τυπώσουμε στην οθόνη με την εντολή print.

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

>>> s= "είμαι απ' την Κρήτη"
>>> print (s)
είμαι απ' την Κρήτη
>>> k = 'λέω και ξαναλέω  "Διάβαζε όσο μπορείς" και όλα θα πάνε καλά'
>>> print (k)
λέω και ξαναλέω "Διάβαζε όσο μπορείς" και όλα πάνε καλά

H Python μας επιτρέπει να περικλείουμε μία συμβολοσειρά σε τριπλά εισαγωγικά (τρεις φορές μονά ή τρεις φορές διπλά εισαγωγικά). Με αυτό τον τρόπο μπορούμε να ορίσουμε συμβολοσειρές που εκτείνονται σε πολλαπλές γραμμές κειμένου. Μία συμβολοσειρά που αρχίζει με τρία εισαγωγικά (μονά ή διπλά) περικλείει οποιοδήποτε αριθμό γραμμών κειμένου και τελειώνει με την ίδια ακολουθία τριπλών εισαγωγικών.

Μέσα σε μία συμβολοσειρά που περικλείεται σε τριπλά εισαγωγικά, μπορούμε να εισάγουμε μέσα της μονά η διπλά εισαγωγικά. Η Python συγκεντρώνει όλο το κείμενο που περικλείεται στα τριπλά εισαγωγικά σε μία ενιαία συμβολοσειρά, με ενσωματωμένους χαρακτήρες νέας γραμμής ( \ n) εκεί που υπάρχει αλλαγή γραμμής.

>>> s = """ κι  εκεί αναλογίστηκα τα χρόνια τα φευγάτα
        φεγγάρι φέρε μου τα όνειρα
       να΄χουν καλά μαντάτα """
>>> print (s)
κι  εκεί αναλογίστηκα τα χρόνια τα φευγάτα
φεγγάρι φέρε μου τα όνειρα
να΄χουν καλά μαντάτα

Προσπέλαση με δείκτες

Μπορούμε να κάνουμε προσπέλαση στους χαρακτήρες μιας συμβολοσειράς χρησιμοποιώντας δείκτες. Ένας δείκτης ορίζει ένα μόνο χαρακτήρα από το σύνολο των χαρακτήρων της συμβολοσειράς. Μπορούμε να ορίσουμε σαν δείκτη ένα ακέραιο αριθμό ή μια έκφραση που αποτιμάται σε ακέραια τιμή. Η πρόσβαση σε ένα χαρακτήρα μιας συμβολοσειράς γίνεται με την αναφορά της θέσης του που δεν είναι άλλο παρά ένας αριθμός που καθορίζει τον χαρακτήρα μέσα στη θέση του. Στην Python για να κάνουμε αναφορά σε ένα χαρακτήρα μέσα στη συμβολοσειρά χρησιμοποιούμε το όνομα της συμβολοσειράς μαζί με ένα ζευγάρι αγκύλες που περικλείουν τον δείκτη. Ο δείκτης ορίζει τον χαρακτήρα που θα προσπελάσουμε κάθε φορά. Στην Python υπάρχει μία συνάρτηση που επιστρέφει  το πλήθος των στοιχείων ή το μήκος της συμβολοσειράς

len (όνομα συμβολοσειράς)

η οποία δέχεται ως παράμετρο το όνομα της συμβολοσειράς και επιστρέφει το μήκος της.

Για τη συμβολοσειρά με όνομα s ο πρώτος χαρακτήρας είναι ο s[0], ο δεύτερος είναι ο s[1] , ο τρίτος είναι ο s[2]… ενώ ο τελευταίος χαρακτήρας είναι ο s[len (s) -1 ]. Αν δώσουμε δείκτη έξω από τα όρια θα πάρουμε μήνυμα σφάλματος. Μπορούμε να χρησιμοποιήσουμε αρνητικούς δείκτες οι οποίοι μετράμε από το τέλος της συμβολοσειράς προς την αρχή. Ο δείκτης -1 αντιπροσωπεύει τον τελευταίο χαρακτήρα, -2 τον προτελευταίο κ.ο.κ. μέχρι τον –len (s) που αντιπροσωπεύει τον πρώτο χαρακτήρα.

Διάσχιση

Διάσχιση είναι η διαδικασία της προσπέλασης κάθε χαρακτήρα μιας συμβολοσειράς ένα χαρακτήρα κάθε φορά από την αρχή έως το τέλος της συμβολοσειράς. Ένας τρόπος διάσχισης μιας συμβολοσειράς είναι με τη χρήση της εντολής while.

Παράδειγμα

>>> name = 'Νίκο'
>>>index = 0
>>> while index < len(name):
              print(name[index])
              index +=1
Ν
ί
κ
ο

Στο προηγούμενο παράδειγμα ο βρόγχος while διασχίζει τη συμβολοσειρά name και σε κάθε επανάληψη εμφανίζει και από ένα χαρακτήρα της συμβολοσειράς σε διαφορετική γραμμή. Όταν η τιμή του index γίνει ίση με len(name) (μήκος συμβολοσειράς) η συνθήκη γίνεται false  και η επανάληψη δεν εκτελείται. Ο τελευταίος χαρακτήρας της συμβολοσειράς αντιστοιχεί στο δείκτη είναι len (name)-1. Μπορούμε να κάνουμε διάσχιση μιας συμβολοσειράς και με την εντολή for.

Παράδειγμα:

>>> name = ‘Νικος’
>>> for char in name:
      print (char)
Ν
ί
κ
ο

Κάθε φορά που εκτελείται ο βρόγχος, ένας χαρακτήρας της συμβολοσειράς εκχωρείται στη μεταβλητή char με τον τελεστή in μέχρι να εξαντληθούν όλοι οι χαρακτήρες.

Διαμέριση συμβολοσειράς

Με τον όρο διαμέριση μιας συμβολοσειράς εννοούμε την εξαγωγή οποιουδήποτε τμήματος μιας συμβολοσειράς. Με την διαμέριση παίρνουμε ένα υποσύνολο της συμβολοσειράς που γίνεται με τον τελεστή [ ]  ορίζοντας την αρχική και τελική θέση του επιθυμητού τμήματος ενώ θέτουμε ανάμεσα τους την άνω και κάτω τελεία:

  • [n:m] με αυτό το τελεστή η Python παίρνει το τμήμα της συμβολοσειράς από τον n-οστο χαρακτήρα έως τον m-οστο χαρακτήρα, το οποίο περιλαμβάνει τον πρώτο χαρακτήρα και όχι τον τελευταίο.
  • [:m] με αυτό τον τελεστή η Python ορίζει να πάρουμε το τμήμα από την αρχή της συμβολοσειράς (δείκτης 0) έως το m-οστο χαρακτήρα (τον οποίο δεν συμπεριλαμβάνει)
  • [n:] με αυτό τον τελεστή η Python ορίζει το τμήμα της συμβολοσειράς από τον n-οστό χαρακτήρα (τον οποίο συμπεριλαμβάνει) έως το τέλος της συμβολοσειράς.

Στον τελεστή της διαμέρισης μπορούμε να εισάγουμε αρνητικούς δείκτες. Ένας αρνητικός δείκτης ορίζει τον χαρακτήρα από το τέλος της συμβολοσειράς. Αν στον τελεστή της διαμέρισης χρησιμοποιήσουμε αρνητικούς δείκτες η εξαγωγή γίνεται από το τέλος και όχι από την αρχή. Στον τελεστή [ ] οι τιμές θα πρέπει να είναι ορισμένες από την μικρότερη έως τη μεγαλύτερη. Διαφορετικά εμφανίζεται η κενή συμβολοσειρά (“)

Ακολουθίες διαφυγής                   

Μία συμβολοσειρά στην οποία θέλουμε να υπάρχει εσωτερικά ένα ή περισσότερα μονά εισαγωγικά, την περικλείουμε σε διπλά εισαγωγικά. Ισχύει και το αντίστροφο δηλαδή, μία συμβολοσειρά στην οποία θέλουμε να υπάρχει εσωτερικά ένα ή περισσότερα διπλά εισαγωγικά, την περικλείουμε σε μονά εισαγωγικά. Μία συμβολοσειρά που περικλείεται σε μονά ή διπλά εισαγωγικά, μπορούμε να βάλουμε στο εσωτερικό εισαγωγικά του ίδιου είδους μόνο αν το εισάγουμε σαν «ακολουθία διαφυγής». Με τον όρο ακολουθία διαφυγής εννοούμε τον συνδυασμό των χαρακτήρων αριστερής πλάγιας “ \ “ και του χαρακτήρα μονών  (΄ ) ή διπλών εισαγωγικών (“).

Παράδειγμα

>>> s = 'άσπρη πέτρα ξέξασπρη και απ\' τον ήλιο ξεξασπρότερη»
>>> print(s)
Άσπρη πέτρα ξέξασπρη και απ'τον ήλιο ξεξασπρότερη

Ο χαρακτήρας  « \ » που εισάγεται πρώτος στις ακολουθίες διαφυγής επιτρέπει την εισαγωγή κωδικών σε συμβολοσειρές που δεν μπορούν να εισαχθούν από το πληκτρολόγιο. Οι ακολουθίες διαφυγής είναι συγκεκριμένοι συνδυασμοί χαρακτήρων που επιτελούν ειδική λειτουργία που δεν εκτυπώνεται. Ο χαρακτήρας « \  » δείχνει ότι ακολουθεί χαρακτήρας διαφυγής. Όταν ο χαρακτήρας « \ » χρησιμοποιηθεί κατάλληλα μόνος του, εκτός συμβολοσειράς, δίνει τη δυνατότητα συνέχισης μιας εντολής σε περισσότερες από μία γραμμές.

Παράδειγμα:

>>> print('Ο Νίκος είναι \n 40 χρόνων')
    Ο Νίκος είναι
      40 χρόνων

Ο χαρακτήρας διαφυγής αριστερός κάθετος μαζί με συγκεκριμένους χαρακτήρες δημιουργούν τις ακόλουθες ακολουθίες διαφυγής που επιτελούν ειδικές λειτουργίες. Η ακολουθία διαφυγής  \n προκαλεί αλλαγή γραμμής στην εκτύπωση

>>> s = 'Πανεπιστήμιο \n Πατρών \n Tμήμα \n Χημείας'
>>> print(s)
  Πανεπιστήμιο
  Πατρών
  Τμήμα
  Χημείας
>>>

H ακολουθία διαφυγής  \t προκαλεί την εκτύπωση του κενού διαστήματος tab

>>> s = 'Πανεπιστήμιο \t Πατρών   \t Τμήμα   \t Χημείας'
>>> print(s)
Πανεπιστήμιο      Πατρών       Τμήμα           Χημείας
>>> 

Η ακολουθία διαφυγής  \\ διπλή ανάποδη κάθετος εμφανίζει την ίδια ανάποδη κάθετο

>>> s = 'Πανεπιστήμιο  \\    Πατρών   \\   Τμήμα   \\  Χημείας'
>>> print(s)
Πανεπιστήμιο  \  Πατρών   \  Τμήμα  \  Χημείας

Η ακολουθία διαφυγής  \΄ εμφανίζει το μονό εισαγωγικό

>>> s = 'Πανεπιστήμιο  \' Πατρών  \'  Τμήμα \' Χημείας'
>>> print(s)
Πανεπιστήμιο' Πατρών' Τμήμα' Χημείας'
>>> 

Η ακολουθία διαφυγής    \“  εμφανίζει το διπλό εισαγωγικό

>>> s = 'Πανεπιστήμιο  \"  Πατρών  \"  Τμήμα  \" Χημείας'
>>> print(s)
Πανεπιστήμιο " Πατρών " Τμήμα " Χημείας

Εισάγοντας την αριστερή κάθετο  \   σε μια συμβολοσειρά και αν πατήσουμε enter αμέσως μετά ώστε η συμβολοσειρά να αλλάξει γραμμή κατά την εκτύπωση η συμβολοσειρά εμφανίζεται ενιαία σε μια γραμμή.

s='Πανεπιστήμια Πα \
τρων Τμήμα Χημείας'
print(s)
Πανεπιστήμια Πα τρων Τμήμα Χημείας

Ο Τελεστής ‘+

Όπως είπαμε οι συμβολοσειρές είναι αμετάβλητες δηλαδή μετά την δημιουργία τους δεν μπορούμε να τις τροποποιήσουμε. Αν θέλουμε να κάνουμε αυτό θα πρέπει να δημιουργήσουμε ένα νέο αντικείμενο.

Για να συνενώσουμε δύο συμβολοσειρές σε νέο αντικείμενο χρησιμοποιούμε τον τελεστή ΄+΄

>>> s = 'Μελετώ την ' + ' γλώσσα Python'
>>> print(s)
Μελετώ την γλώσσα Python
>>> s1 = 'Μελετώ την '
>>> s2 = 'γλώσσα Python'
>>> s=s1+s2
>>> print(s)
Μελετώ την γλώσσα Python

Ο Τελεστής ‘ *

Ο τελεστής * εφαρμόζεται μεταξύ μιας συμβολοσειράς και ενός ακέραιου που έχει ως αποτέλεσμα να επαναλάβει την συμβολοσειρά τόσες φορές όσες δείχνει ο ακέραιος.

Παράδειγμα

>>> print ('p'*3 + 'i'*5)
pppiiiii

Ο Τελεστής ‘in

Mε τον λογικό τελεστή in μπορούμε να επαληθεύσουμε αν μια συμβολοσειρά είναι τμήμα μιας άλλης συμβολοσειράς

Παράδειγμα:

>>> "v" in "University"
True

Στο παραπάνω παράδειγμα η Python επαληθεύει ότι η αριστερή συμβολοσειρά είναι τμήμα της δεξιάς συμβολοσειράς

Παράδειγμα

>>> k = 'Pyt' in 'Python'
>>> print(k)
True

Σύγκριση συμβολοσειρών

Στην Python οι χαρακτήρες κωδικοποιούνται στον κώδικα Unicode. Ο κάθε χαρακτήρας που ορίζεται στον κώδικα Unicode αντιπροσωπεύεται με μία τιμή που αποτελείται από 16 bits. Έτσι με αυτή την κωδικοποίηση μπορούμε να ορίσουμε 65536 (216) διαφορετικούς χαρακτήρες. Έτσι ο κάθε χαρακτήρας αντιπροσωπεύεται από ένα κωδικό που μπορούμε να τυπώσουμε με την συνάρτηση ord( ).

Για ένα χαρακτήρα που γνωρίζουμε τον αντίστοιχο κωδικό αριθμό στο σύστημα κωδικοποίησης Unicode μπορούμε να τον τυπώσουμε με τη χρήση της συνάρτησης chr( ).  Με τους τελεστές σύγκρισης μπορούμε να συγκρίνουμε συμβολοσειρές μεταξύ τους. Η σύγκριση γίνεται λεξικογραφικά που βασίζεται στη διάταξη των χαρακτήρων στο σύστημα κωδικοποίησης Unicode που χρησιμοποιούμε στην Python.

Χρησιμοποιώντας προσδιοριστές μορφοποίησης σε μια συμβολοσειρά.

Όπως είπαμε σε προηγούμενη ενότητα μπορούμε να εισάγουμε ορίσματα σε μία συμβολοσειρά χρησιμοποιώντας προσδιοριστές μορφοποίησης βάσει του χαρακτήρα %.

Παράδειγμα:

>>> s = '0 %s είναι %d ετών και έχει %6.2f ύψος' %('Νίκος', 31, 1.70)
>>> print(s)
0 Νίκος είναι 31 ετών και έχει   1.70 ύψος