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 escapeIl 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.
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 -1s = "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:].
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.
| 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 (find dà -1 se manca, index solleva ValueError) |
count(sub) |
"banana".count("a") |
3 |
replace(old, new) |
"aaa".replace("a", "b", 2) |
'bba' |
startswith(), endswith() |
"file.py".endswith(".py") |
True |
isdigit(), isalpha(), isspace(), isupper() |
"123".isdigit() |
True |
# 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)Specificatori dopo :: allineamento (<, >, ^), larghezza, .n cifre decimali, tipo (d intero, f virgola fissa, e esponenziale, % percentuale). Il metodo "{}".format(x) fa la stessa cosa con sintassi più vecchia.
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().