Revenge of the Strings

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

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

    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