Keywords: easytut-it

Next: File IO Up: Tutorial per principianti in Previous: Ancora sulle liste Indice
Subsections

- Esempi

# La rivincita 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")

E 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 utilizzato il `len` anche con le stringhe, così come gli indici e le sezioni. Molte funzionalità delle liste funzionano con le stringhe.

La prossima funzione utilizzerà alcune funzionalità specifiche delle stringhe:

    def to_upper(string):
        ## Converte la stringa in maiuscolo.
        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 che è:

    THIS IS TEXT

Il motivo per cui questo codice funziona è che il computer rappresenta i caratteri delle stringhe come numeri da 0 a 255. Python ha una funzione chiamata `ord` (abbreviazione di ordinale) che ritorna un carattere come un numero. Esiste anche una funzione corrispondente `chr` che converte un numero in un carattere. Capito questo, il programma dovrebbe essere chiaro. Il primo dettaglio è la linea: `if 'a' <= character <= 'z':` che controlla se la lettera è minuscola. Se è così, allora prosegue alla linea successiva. 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.

Adesso, qualche esercizio interattivo da digitare:

    >>> # Da intero a stringa.
    ...
    >>> 2
    2
    >>> repr(2)
    '2'
    >>> -123
    -123
    >>> repr(-123)
    '-123'
    >>> # Da stringa a intero.
    ...
    >>> "23"
    '23'
    >>> int("23")
    23
    >>> "23"*2
    '2323'
    >>> int("23")*2
    46
    >>> # Da decimale a stringa.
    ...
    >>> 1.23
    1.23
    >>> repr(1.23)
    '1.23'
    >>> # Da decimale a intero.
    ...
    >>> 1.23
    1.23
    >>> int(1.23)
    1
    >>> int(-1.23)
    -1
    >>> # Da stringa a decimale.
    ...
    >>> 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 di quanto detto:

    >>> 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. La funzione `eval` prende una stringa e ritorna i dati che Python rileva. 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 è `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).

# 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")

L'output è:

    2
    23445
    -23445
    14234
    12345
    -3512

Next: File IO Up: Tutorial per principianti in Previous: Ancora sulle liste Indice