14. Metodi delle Stringhe

In questa lezione approfondiremo la nostra conoscenza delle stringhe in Python introducendo alcuni metodi molti utili propri di questo tipo di dato e facendo alcune analogie col tipo di dato lista, scoprendo più di qualche punto in comune tra i due!


F-String o Formatted String Literal

Finora quando abbiamo dovuto concatenare più stringhe tra di loro, abbiamo utilizzato l'operatore +:

>>> nome = "Jack"
>>> "Ciao " + nome
'Ciao Jack'

Per poter unire dei valori numerici inoltre, abbiamo sempre dovuto utilizzare la funzione di supporto str(), che ci permette di ottenere la rappresentazione in stringa:

numero = 218
>>> "Ciao " + nome + " il tuo posto è il n" + str(numero)
'Ciao Jack il tuo posto è il n218'

Questo può portare a confusione o alla creazione di righe di codice particolarmente lunghe e difficili da leggere. In alternativa possiamo usare un sistema di formattazione avanzata chiamato Formatted String Literal, o f-string.

Con le f-string valori, variabili o espressioni possono essere passati all'interno di parentesi graffe.

>>> f"Ciao {nome}, il tuo posto è il n{numero}! Benvenuto!"
'Ciao Jack,  il tuo posto è il n18! Benvenuto!'

Facciamo un altro esempio:

>>> z = 5
>>> f"Il quadrato di {z} è {z * z}"
'Il quadrato di 5 è 25'

Vi consiglio di tenere a mente questa tecnica di formattazione delle stringhe perché penso vi troverete ad usarla spessissimo.


Metodi per Stringhe

Come abbiamo detto nelle lezioni precedenti del corso, i metodi sono delle "funzioni speciali" proprie nel nostro caso dei tipi di dato. Sono proprietà di oggetti di una determinata tipologia.

diagramma_metodi.png

Anche il tipo di dato stringa dispone di metodi propri molto comodi per permetterci di eseguire svariate comode azioni. I metodi delle stringhe sono davvero tanti e per un elenco completo vi consiglio di dare uno sguardo a questa pagina.

In questa lezione analizzeremo alcuni dei metodi più comunemente utilizzati.

I metodi startswith() e endswith()

Con startswith() e endswith() possiamo controllare se una data stringa inizi o finisca con un determinato carattere o insieme di caratteri. Questi metodi restituiscono valori booleani, quindi ricordiamolo, True o False.

>>> messaggio = "Fate il vostro gioco"

>>> messaggio.startswith("Fate")
True
>>> messaggio.startswith("F")
True
>>> messaggio.starstwith("x")
False

>>> messaggio.endswith("gioco")
True
>>> messaggio.endswith("gioc")
False

I metodi isalnum(), isalpha(), isdecimal() e isspace()

Capiterà spesso che dobbiate verificare la tipologia di caratteri contenuti in una stringa, e i metodi isalnum()isalpha(), isdecimal() e isspace() ci permettono di verificare proprio ciò per la gran parte dei casi più comuni, restituendoci True se la condizione è veritiera:

  • metodo isalnum(): solo caratteri alfanumerici
  • metodo isalpha(): solo caratteri alfabetici
  • metodo isdecimal(): solo numeri
  • metodo isspace(): tutti i caratteri sono spazi bianchi
spam = "asd123"
eggs = "999"
bacon = "   "
monty = "poker "

>>> spam.isalnum()
True
>>> spam.isalpha()
False

>>> eggs.isdecimal()
True
>>> eggs.isalnum()
True

>>> monty.isspace()
False
>>> bacon.isspace()
True

I metodi upper() e lower()

I metodi upper() e lower() ci permettono di ottenere la versione maiuscola o minuscola di una stringa. Tenete però a mente che questi metodi non modificano il valore contenuto in una determinata variabile: per fare ciò sarà necessario assegnare un nuovo valore alla stessa variabile.

>>> name = "Alice"

>>> name.lower()
'alice'

>>> name.upper()
'ALICE'

# il valore di name non è cambiato
>>> name
'Alice'

>>> name = name.upper()

# il valore di name è ora stato cambiato
>>> name
'ALICE'

I metodi split() e join()

Il metodo join() è utile quando ci troviamo con una lista di stringhe e vogliamo unirle tra di loro per formare una nuova stringa risultante, come nel caso di una lista di parole. Questo metodo viene chiamato su una stringa che usiamo "a mo' di collante" tra le varie stringhe che vogliamo unire. Nel nostro caso questa stringa "collante" potrebbe essere una virgola seguita da uno spazio, oppure un carattere newline.

>>> to_do = ["portare il cane a passeggio", "finire di studiare", "fare la spesa", "lavare i panni"]

>>> ", ".join(to_do)
'portare il cane a passeggio, finire di studiare, fare la spesa, lavare i panni'

>>> da_fare = "oggi devo: " + ", ".join(to_do)

>>> da_fare
'oggi devo: portare il cane a passeggio, finire di studiare, fare la spesa, lavare i panni'

##################################################################

>>> da_fare = "\n".join(to_do)

>>> print(da_fare)
portare il cane a passeggio
finire di studiare
fare la spesa
lavare i panni

Col metodo split() possiamo al contrario dividere una stringa in una lista di stringhe, e dovremo passare come parametro il carattere che intendiamo usare come separatore.

>>> citazione = "Nel mezzo del cammin di nostra vita..."

>>> citazione.split(" ")
['Nel', 'mezzo', 'del', 'cammin', 'di', 'nostra', 'vita...']

Il metodo format()

Per formattare le stringhe possiamo utilizzare anche il metodo format():

stringa.format(valore1, valore2, ...)

Dove stringa è la stringa da formattare e valore1valore2, ecc. sono i valori da inserire nella stringa. Il metodo format() sostituisce ogni posizione {} nella stringa con il valore corrispondente passato come parametro. Ad esempio:

>>> colore1 = "blu"
>>> colore2 = "verde"
>>> s = "I miei colori preferiti sono {} e {}.".format(colore1, colore2)
>>> print(s)

# output
I miei colori preferiti sono blu e verde.

Questo metodo è utile quando si devono creare stringhe complesse o dinamiche, dove i valori possono variare a seconda della situazione ed era molto utilizzato prima della versione 3.6 di Python: nel PEP 498 sono state proposte e poi aggiunte nel linguaggio le f-string, che risultano molto più compatte e rendono il codice più facilmente leggibile.


Similarità tra Liste e Stringhe

I tipi di dato di Python list e string sono per certi aspetti simili tra di loro, e per questo motivo ci sono alcune tipologie di azioni che possiamo fare su entrambi. Potete in questi esempi pensare quindi alle stringhe come a delle liste di caratteri.

La funzione len()

La funzione integrata di Python len() ci permette di ottenere la lunghezza di una lista o una stringa, e quindi rispettivamente il numero di elementi o di caratteri presenti in queste:

>>> my_str = "spam, eggs, bacon, spam"
>>> my_list = ["spam", "spam", "spam"]

>>> len(my_str)
23

>>> len(my_list)
3

Operatori in e not in

Possiamo usare gli operatori in e not in per verificare se un elemento o un carattere sia presente in una lista o stringa:

>>> my_list = ["spam", "spam", "spam"]
>>> new_str = "happiness"

>>> "bacon" in my_list
False
>>> "spam" in my_list
True
>>> "eggs" not in my_list
True

>>> "k" not in new_str
True
>>> "h" in new_str
True

String Slicing

In maniera analoga a quanto visto con le liste, possiamo accedere ai caratteri di una stringa tramite indice, in modo da ottenere una porzione della stessa. In questo esempio abbiamo una variabile chiamata alfa che contiene un insieme di caratteri alfabetici + tre punti di sospensione.

Volendo possiamo isolare la porzione puramente alfabetica o i tre punti usando lo slicing e usare questi valori per creare delle nuove variabili:

>>> alfa = "abcdefghijklm..."

>>> dots = alfa[-3:]
>>> dots
'...'

>>> alfa = alfa[:-3]
>>> alfa
'abcdefghijklm'

Stringhe e cicli for

Come per le liste, possiamo usare i cicli for assieme alle nostre stringhe:

random_alnum = "dj1oi3u4nuqnoru01u3m3mdasd"
counter = 0
match = "d"

for char in random_alnum:
    if char == match:
        counter += 1
        
output = f"Ho trovato {counter} caratteri '{match}' "

>>> output
"Ho trovato 3 caratteri 'd' "