Sequenze e cicli

Come trattare sequenze di dati.

Nei capitoli precedenti abbiamo visto alcuni tipi di dati, int, float, str e un modo per ripetere le istruzioni usando l’istruzione for. In questo capitolo approfondiamo la conoscenza delle stringhe e dell’istruzione for, vedendo come sono collegati tra di loro. Come già visto una stringa è una sequenza di caratteri e in ogni sequenza, si può:

  • estrarne un elemento,
  • estrarne uno alla volta tutti gli elementi,
  • estrarne una porzione (una fetta),
  • ottenere il numero di elementi che la compongono.

Costruiamo una stringa e stampiamo la sua lunghezza, cioè il numero di elementi che la compongono:

>>> s="Pippo Pluto Paperino"
>>> print(s)
Pippo Pluto Paperino
>>> print(len(s))
20

Se vogliamo stampare un suo carattere possiamo applicare alla sequenza un indice:

>>> print(s[1])
i

Possiamo anche dire a Python di stamparne più di uno separati da uno spazio, magari iniziando a contare dall’ultimo elemento:

>>> print s[-1], s[-4], s[-10]
o r o

Ed ora vediamo come il ciclo for è collegato con le sequenze. L’uso già visto nel capitolo sulla ripetizione di istruzioni è solo una delle possibilità dell’istruzione for. In generale questa istruzione permette di scorrere gli elementi di una sequenza. Come esempio, stampiamo una sotto l’altra le lettere di una parola:

>>> for carattere in "Casa": print carattere

C
a
s
a

Notare l’uso della virgola nell’istruzione. In un nuovo file (stringhe.py) scriviamo la procedura per stampare una parola triangolare: l’intera parola, la parola senza la prima lettera, poi senza la seconda, e così via:

def triangolo(s):
    for indice in range(len(s)):
        print s[indice:]

e, nella shell di IDLE, la proviamo:

>>> triangolo("scala")
scala
cala
ala
la
a

È possibile controllare se un carattere appartiene ad una stringa con l’operatore in:

>>> 'u' in 'trallallà'
False
>>> 'a' in 'trallallà'
True

Se volessimo contare le vocali presenti in una stringa o più in generale quante sono le lettere che appartengono ad un determinato insieme possiamo creare una funzione che riceva due argomenti: la stringa in cui contare i caratteri e una stringa che contiene i caratteri da contare:

def contacaratteri(stringa, caratteri):
    """Restituisce il numero degli elementi di stringa presenti in
       caratteri."""
    contatore = 0
    for c in stringa:
        if c in caratteri:
            contatore += 1
    return contatore

>>> print(contacaratteri('ambarabà cicì cocò', 'aeiou'))
5

Riassumendo

  • Le stringhe sono degli oggetti - sequenza, vuol dire che sono viste da Python come una sequenza ordinata di elementi. Nel caso delle stringhe, ovviamente, gli elementi sono caratteri.

  • Il primo elemento di una sequenza ha sempre indice 0, l’ultimo ha indice -1.

  • È possibile estrarre un elemento di una sequenza con la sintassi: <sequenza>[<indice>].

  • L’indice può essere un numero positivo (il conteggio parte dall’inizio) o negativo (il conteggio parte dalla fine). Se l’indice eccede i limiti della sequenza viene sollevato un errore.

  • L’istruzione for permette di scorrere gli elementi di una sequenza, la sua sintassi è:

    for <variabile> in <sequenza>
        <istruzioni>
    

Prova tu

  1. Scrivi la procedura verticale(s) che stampa i caratteri di una stringa uno sotto l’altro.
  2. Scrivi la procedura triangoloinverso(s) che stampa l’ultimo carattere di una stringa, poi gli ultimi due e così via fino a stampare tutta la stringa.
  3. Scrivi la funzione che, data una stringa, stampi le sue lettere saltando gli spazi.
  4. Scrivi la funzione che, data una stringa, stampi le sue lettere saltando le vocali.