Η εκδικηση των συμβολοσειρων

Και τωρα ένα τρομερο κολπο που μπορουμε να κάνουμε με συμβολοσειρές:

def shout(string):
    for character in string:
        print "Gimme a "+character
        print "'"+character+"'"

shout("Lose")

def middle(string):
    print "The middle character is:",string[len(string)/2]

middle("abcdefg")
middle("The Python Programming Language")
middle("Atlanta")

Με αποτέλεσμα:

Gimme a L
'L'
Gimme a o
'o'
Gimme a s
's'
Gimme a e
'e'
The middle character is: d
The middle character is: r
The middle character is: a
Τα προγραμματα αυτα δειχνουν οτι οι συμβολοσειρές έχουν πολλες ομοιοτητες με τους καταλογους σε πολλα σημεια. Η διαδικασια shout δείχνει οτι οι βρογχοι for μπορουν να χρησιμοποιηθουν σε συμβολοσειρες οπως και στους καταλογους. Η διαδικασια middle μας δειχνει οτι οι συμβολοσειρες μπορουν να χρησιμοποιησουν την συνάρτηση len καθως και ευρετηρια και φετες απο πινακες. Οι περισσοτερες δυνατοτητες που εχουμε με τους καταλογους ισχυουν και για τις συμβολοσειρες.

Το επομενο παραδειγμα μας δείχνει καποιες συγκεκριμενες δυνατοτητες που εχουμε για τις συμβολοσειρές:

def to_upper(string):
    ## Converts a string to upper case
    upper_case = ""
    for character in string:
        if 'a' <= character <= 'z':
            location = ord(character) - ord('a')
            new_ascii = location + ord('A')
            character = chr(new_ascii)
        upper_case = upper_case + character
    return upper_case

print to_upper("This is Text")
with the output being:
THIS IS TEXT
Το προγραμμα δουλευει επειδη ο υπολογιστης βλεπει τους χαρακτηρες μιας συμβολοσειρας σαν αριθμους απο το 0 ως το 255. Η Python έχει μια συνάρτηση που λεγεται ord (συντομευση του ordinal) η οποια επιστρεφει εναν χαρακτηρα σαν αριθμο. Υπαρχει επισης η αντιστροφη συνάρτηση που λεγεται chr και μετατρεπει έναν αριθμο σε γραμμα. Γνωρίζοντας πλεον αυτα, το προγραμμα πρεπει να αρχιζει να ξεκαθαρίζει . Η πρώτη λεπτομέρεια ειναι η γραμμη: if 'a' <= character <= 'z': που ψαχνει να μαθει αν το γραμμα είναι πεζο. Αν είναι οι πεομενες γραμμες τρεχουν. Πρωτα μετατρεπεται σε μια περιοχη που a=0,b=1,c=2 κλπ με την γραμμή: location = ord(character) - ord('a'). Μετά εντοπιζεται η νέα τιμη με την γραμμη new_ascii = location + ord('A'). Η νεα αυτη τιμη μετατρεπεται ξανά σε γράμμα που είναι πλεον κεφαλαιο.

Παμε τωρα για μια ασκηση πληκτρολογησης:

>>> #Integer to String
... 
>>> 2
2
>>> repr(2)
'2'
>>> -123
-123
>>> repr(-123)
'-123'
>>> #String to Integer
... 
>>> "23"
'23'
>>> int("23")
23
>>> "23"*2
'2323'
>>> int("23")*2
46
>>> #Float to String
... 
>>> 1.23
1.23
>>> repr(1.23)
'1.23'
>>> #Float to Integer
... 
>>> 1.23
1.23
>>> int(1.23)
1
>>> int(-1.23)
-1
>>> #String to Float
... 
>>> float("1.23")
1.23
>>> "1.23" 
'1.23'
>>> float("123")
123.0

Αν δεν το εχετε μαντεψει ακομα, η συνάρτηση repr μετατρεπει έναν ακεραιο σε συμβολοσειρα και η συνάρτηση int το αντίστροφο, δηλαδη, έναν χαρακτηρα σε αριθμο. Η συνάρτηση float μπορεί να μετατρεψει έναν χαρακτήρα σε αριθμο κινητης υποδιαστολης. Η συνάρτηση repr επιστρεφει μια εκτυπωσιμη αναπαράσταση από ...κάτι. Να κάποια παραδειγματα:

>>> repr(1)
'1'
>>> repr(234.14)
'234.14'
>>> repr([4,42,10])
'[4, 42, 10]'
Η συνάρτηση int προσπαθεί να μετατρεψει μια συμβολοσειρά (η έναν αριθμο κινητης υποδιαστολης) σε ακεραιο. Υπαρχει μια παρομοια συάρτηση, η float, που μετατρεπει έναν ακεραιο ή μια συμβολοσειρα σε αριθμο κινητής υποδιαστολης. Μια άλλη συνάρτηση που περιλαμβάνεται στην Python είναι η eval. Η eval παιρνει μια συμβολοσειρα και επιστρεφει δεδομένα του τυπου που η python νομιζει οτι βρηκε. Για παράδειγμα:
>>> v=eval('123')
>>> print v,type(v)
123 <type 'int'>
>>> v=eval('645.123')
>>> print v,type(v)
645.123 <type 'float'>
>>> v=eval('[1,2,3]')
>>> print v,type(v)
[1, 2, 3] <type 'list'>
Αν χρησιμοποιητε την συναρτηση eval θα πρεπει να ελεγχετε το αν επιστρεφει τον τυπο των δεοδομένων που περιμένετε.

Μια πολυ χρησιμη συνάρτηση συμβολοσειρων ειναι η split. Να ενα παραδειγμα:

>>> import string
>>> string.split("This is a bunch of words")
['This', 'is', 'a', 'bunch', 'of', 'words']
>>> string.split("First batch, second batch, third, fourth",",")
['First batch', ' second batch', ' third', ' fourth']
Προσεξτε πως η split μετατρεπει μια συμβολοσειρα σε κατάλογο συμβολοσειρων. Η συμβολοσειρα χωριζεται εξ ορισμου με τα κενά η με κάποια άλλη προσθετη παράμετρο (εδω με το κομμα).

Παραδειγματα

#This program requires a excellent understanding of decimal numbers
def to_string(in_int):
    "Converts an integer to a string"
    out_str = ""
    prefix = ""
    if in_int < 0:
        prefix = "-"
        in_int = -in_int        
    while in_int / 10 != 0:
        out_str = chr(ord('0')+in_int % 10) + out_str
        in_int = in_int / 10
    out_str = chr(ord('0')+in_int % 10) + out_str
    return prefix + out_str

def to_int(in_str):
    "Converts a string to an integer"
    out_num = 0
    if in_str[0] == "-":
        multiplier = -1
        in_str = in_str[1:]
    else:
        multiplier = 1
    for x in range(0,len(in_str)):
        out_num = out_num * 10 + ord(in_str[x]) - ord('0')
    return out_num * multiplier

print to_string(2)
print to_string(23445)
print to_string(-23445)
print to_int("14234")
print to_int("12345")
print to_int("-3512")

Το αποτελεσμα ειναι:

2
23445
-23445
14234
12345
-3512