Capitolo 14. La vendetta delle stringhe

Ora presenteremo un trucco che può essere usato con le stringhe:

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")
Ecco l'output:
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
Questo programma dimostra che le stringhe sono per alcuni aspetti simili alle liste. La procedura shout dimostra che un ciclo for può essere usato con le stringhe esattamente nello stesso modo in cui veniva usato con le liste. La procedura middle mostra come possa essere utilizzata la funzione len anche con le stringhe, così come gli indici e le slice. Molte funzioni delle liste funzionano con le stringhe.

La prossima funzione utilizzerà alcune funzioni specifiche delle stringhe:

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")
Con l'output:
THIS IS TEXT
Il motivo per cui questo codice funziona è che il computer "vede" le lettere come numeri da 0 a 255. Python ha una funzione ord (abbreviazione di ordinale) che ritorna un carattere come un numero. Esiste anche una funzione corrispondente chr che converte un numero in un carattere. Imparate queste funzioni, il programma dovrebbe essere chiaro. Il primo dettaglio è la linea: if 'a' <= character <= 'z': che controlla se la lettera è minuscola. La linea: location = ord(character) - ord('a') converte i numeri corrispondenti alle lettere nel codice ASCII in numeri da 0 a 36 quindi la linea new_ascii = location + ord('A') converte la lettera minuscola in maiuscola.

Un'altro esercizio:

>>> #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
Se non l'avete ancora indovinato la funzione repr converte un intero in stringa e la funzione int converte una stringa in intero. La funzione float converte una stringa in un numero in virgola mobile. La funzione repr ritorna una rappresentazione stampabile di qualcosa. Ecco alcuni esempi:
>>> repr(1)
'1'
>>> repr(234.14)
'234.14'
>>> repr([4,42,10])
'[4, 42, 10]'
La funzione int prova a convertire una stringa (o un numero in virgola mobile) in un intero. Esiste anche una funzione simile float che converte un numero intero in numero in virgola mobile. Un'altra funzione di Python è eval che ritorna il tipo di dato che viene immesso. Per esempio:
>>> 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'>
Se usate la funzione eval dovete controllare il valore che ritorna per assicurarvi che sia quello che vi aspettate.

Un'altra funzione utile in string è la funzione split. Questo è un esempio:

>>> 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']
Notate come split converte una stringa in una lista di stringhe. La stringa viene divisa in corrispondenza di ogni spazio o di un secondo argomento (in questo caso la virgola).

14.1. Esempi

#Questo programma richiede un'eccellente conoscenza dei numeri decimali
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")
Ecco l'output:
2
23445
-23445
14234
12345
-3512