Stringhe in Python
In questa pagina 7
Letterali
s = 'testo'
s = "l'apostrofo va bene tra virgolette doppie"
s = """più
righe"""
s = "tab:\t, a capo:\n, backslash: \\"
r = r"C:\cartella\nuova" # raw string: i backslash non sono sequenze di escapeDefinizione (str). Il tipo è
str: sequenza immutabile di caratteri Unicode (vedi Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati →). Non esiste un tipo carattere: un carattere è una stringa di lunghezza 1.
Esempio. Con s = "ciao", s[0] = "C" solleva TypeError, mentre "C" + s[1:] costruisce la nuova stringa 'Ciao'.
Indici e slicing
c i a o m o n d o
0 1 2 3 4 5 6 7 8 9
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1Definizione (indici e slicing)
s = "ciao mondo" s[0], s[-1] # ('c', 'o') s[5:] # 'mondo' s[:4] # 'ciao' s[2:7] # 'ao mo' (indice 7 escluso) s[::2] # 'ca od' (passo 2) s[::-1] # 'odnom oaic' (rovesciata)
s[i]conifuori intervallo →IndexError; lo slicing invece non dà mai errore (s[100:]è"").s[i:j]ha lunghezzaj - i(per indici validi).s[0] = "C"→TypeError: le stringhe sono immutabili. Si costruisce una stringa nuova:"C" + s[1:].
Esempio. Con s = "ciao mondo", s[2:7] vale 'ao mo' (lunghezza ), s[::-1] vale 'odnom oaic' e s[100:] vale "".
Operatori
"ab" + "cd" # 'abcd'
"ab" * 3 # 'ababab'
"mo" in "mondo" # True (sottostringa)
len("città") # 5
"abc" < "abd" # True: confronto lessicografico per code point
"Zeta" < "alfa" # True: le maiuscole vengono prima delle minuscoleMetodi principali
Restituiscono sempre una nuova stringa (o altro), l'originale non cambia.
Definizione (metodi principali delle stringhe)
Metodo Esempio Risultato upper(),lower(),capitalize(),title()"ciao".upper()'CIAO'strip(),lstrip(),rstrip()" x \n".strip()'x'split(sep)"a,b,,c".split(",")['a', 'b', '', 'c']split()senza argomenti" a b ".split()['a', 'b'](spazi multipli)sep.join(seq)"-".join(["a", "b"])'a-b'find(sub),index(sub)"ciao".find("a")2(finddà-1se manca,indexsollevaValueError)count(sub)"banana".count("a")3replace(old, new)"aaa".replace("a", "b", 2)'bba'startswith(),endswith()"file.py".endswith(".py")Trueisdigit(),isalpha(),isspace(),isupper()"123".isdigit()True
Esempio. "a,b,,c".split(",") restituisce ['a', 'b', '', 'c'] e "-".join(["a", "b"]) restituisce 'a-b'.
# conteggio delle vocali
vocali = sum(1 for c in testo.lower() if c in "aeiou")
# parole di una frase, senza punteggiatura ai bordi
parole = [p.strip(".,;:!?") for p in frase.split()]Formattazione: f-string
nome, media = "Ada", 27.456
f"{nome} ha media {media:.2f}" # 'Ada ha media 27.46'
f"{42:5d}|{42:<5d}|{42:05d}" # ' 42|42 |00042'
f"{0.25:.1%}" # '25.0%'
f"{x = }" # 'x = 3' (utile per il debug)Definizione (specificatori delle f-string). Specificatori dopo
:: allineamento (<,>,^), larghezza,.ncifre decimali, tipo (dintero,fvirgola fissa,eesponenziale,%percentuale). Il metodo"{}".format(x)fa la stessa cosa con sintassi più vecchia.
Esempio. f"{27.456:.2f}" restituisce '27.46' e f"{42:05d}" restituisce '00042'.
Costruire stringhe in un ciclo
Concatenare con += in un ciclo crea a ogni passo una nuova stringa (costo che può diventare quadratico, vedi Complessità computazionaleCosto di un algoritmo in funzione della dimensione dell'input; caso peggiore, migliore e medio; notazione O-grande e classi di crescita; come contare i passi di cicli e ricorsioni; costo delle operazioni Python.Complessità computazionale →). Meglio accumulare i pezzi in una lista e unirli alla fine:
pezzi = []
for i in range(1000):
pezzi.append(str(i))
risultato = ",".join(pezzi)Errori tipici
- Credere che un metodo modifichi la stringa:
s.upper()da solo non fa niente, serves = s.upper(). "3" + 4→TypeError: convertire constr(4)oint("3").- Confrontare stringhe con maiuscole e minuscole diverse senza normalizzarle (
.lower()). - Dimenticare che
input()restituisce una stringa con eventuali spazi: usare.strip().
Versione ripasso
- Il tipo è
str: sequenza immutabile di caratteri Unicode (vedi Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati →). Raw string:r"C:\cartella\nuova". - Slicing:
s[i:j]ha lunghezzaj - i, non dà mai errore se fuori limiti.s[::-1]rovesciata.s[0] = "C"dàTypeError(immutabili). - Operatori:
+,*,in(sottostringa),len(), confronto lessicografico ("Zeta" < "alfa"perché le maiuscole precedono le minuscole). - Metodi principali:
- Trasformazioni:
upper(),lower(),capitalize(),title(),strip()(rimuove spazi/newline). - Divisione/Unione:
split(sep)(consplit()senza argomenti gestisce spazi multipli),sep.join(seq). - Ricerca:
find(sub)(restituisce-1se manca),index(sub)(sollevaValueError),count(sub),replace(old, new, count),startswith(),endswith(). - Verifica:
isdigit(),isalpha(),isspace(),isupper().
- Trasformazioni:
- f-string:
f"{nome} ha media {media:.2f}",f"{42:05d}",f"{0.25:.1%}",f"{x = }". Specificatori dopo:(allineamento< > ^, larghezza,.ndecimali, tipo). - Costruzione in cicli: usare una lista e
"".join(pezzi)anziché+=in un ciclo, per evitare complessità quadratica (vedi Complessità computazionaleCosto di un algoritmo in funzione della dimensione dell'input; caso peggiore, migliore e medio; notazione O-grande e classi di crescita; come contare i passi di cicli e ricorsioni; costo delle operazioni Python.Complessità computazionale →).
Errori tipici: Credere che i metodi modifichino la stringa esistente; sommare stringhe e interi ("3" + 4); dimenticare di usare .strip() su input(); confrontare stringhe con maiuscole/minuscole miste senza .lower().