Lavorare con il testo — indici, slice e f-string
Estrarre pezzi dal testo, pulirlo, modificarlo e costruire messaggi leggibili con le f-string — più la regola per cui il testo non può essere modificato sul posto.
Come vuoi imparare?
Il problema che stiamo risolvendo
Da un form arriva un nome: " Rafi Ahmed ". Ci sono spazi extra a entrambe le estremità, e a te serve solo il primo nome, più un messaggio — "Welcome, Rafi!".
Questo lavoro — pulire un testo, estrarne dei pezzi e costruirne uno nuovo — è tra i compiti più frequenti in programmazione. Nomi utente, indirizzi email, id, nomi di file, indirizzi, qualunque cosa restituisca un'API: tutto testo.
E in questo capitolo diventerà chiara un'altra cosa, quella che fa perdere ore quando non la si conosce: in Python il testo non può essere modificato. Scrivere name.upper() non rende maiuscolo name. Perché non si può, e cosa fare al suo posto, è la parte più preziosa di questo capitolo.
Alla fine di questo capitolo sarai in grado di
- Raggiungere qualsiasi carattere tramite il suo indice, da davanti e da dietro
- Ritagliare una porzione con uno slice
- Pulire e modificare il testo con
strip,upper,lower,replaceesplit - Spiegare perché il risultato di un metodo va salvato
- Costruire messaggi leggibili con le f-string
Prerequisiti: Aritmetica — divisioni, resti e la trappola del decimale.
Virgolette — singole o doppie
Per Python, 'Rafi' e "Rafi" sono la stessa cosa. Esistono entrambe perché le virgolette dentro il testo non creino problemi:
print("It's working")
print('She said "yes"')It's working
She said "yes"Le triple virgolette racchiudono un testo su più righe:
note = """Dear customer,
Your order is confirmed.
Thank you."""
print(note)Dear customer,
Your order is confirmed.
Thank you.E \n produce un a capo, \t una tabulazione:
print("Name:\tRafi\nRole:\tLearner")Name: Rafi
Role: LearnerLunghezza e indice
word = "PYTHON"
print(len(word))
print(word[0])
print(word[1])
print(word[-1])
print(word[-2])6
P
Y
N
ODue cose da mettere bene a fuoco:
Il conteggio parte da zero. Il primo carattere ha indice 0, il secondo 1. Quindi in una parola di sei caratteri l'ultimo indice è 5, non 6. Chiedere word[6] produce un IndexError. Questo errore dell'"uno in più" è così comune che ha un nome tutto suo: off-by-one error.
Gli indici negativi contano da dietro. word[-1] è l'ultimo carattere, word[-2] quello prima. È il modo più semplice per arrivare alla fine senza conoscere la lunghezza.
Slice — ritagliare una porzione
word = "PROGRAMMING"
print(word[0:7])
print(word[7:11])
print(word[:7])
print(word[7:])
print(word[-4:])PROGRAM
MING
PROGRAM
MING
MINGword[a:b] significa da a fino a escluso b. L'indice finale non viene incluso.
All'inizio sembra strano, ma offre un vantaggio: word[0:7] e word[7:11] si incastrano esattamente, senza ripetere né perdere alcun carattere. Omettere il primo numero significa "dall'inizio assoluto", omettere il secondo significa "fino alla fine".
Il testo non può essere modificato
Questa è la regola più importante di questo capitolo:
name = "rafi"
name[0] = "R"Traceback (most recent call last):
File "D:\python-lab\lesson-06\demo.py", line 2, in <module>
name[0] = "R"
~~~~^^^
TypeError: 'str' object does not support item assignmentLa prima riga File mostra il percorso completo del tuo file, quindi sul tuo computer sarà diversa. Il messaggio vero è nell'ultima riga: un carattere dentro un testo esistente non può essere sostituito. Allora come fanno a funzionare il maiuscolo o la rimozione degli spazi? La risposta: Python non cambia l'originale, ma costruisce un nuovo pezzo di testo e lo restituisce.
name = " rafi "
print(name.strip())
print(name.strip().upper())
print("After all that, name is still:", name)rafi
RAFI
After all that, name is still: rafiname non è cambiato affatto. strip() ha prodotto un nuovo testo pulito, e noi lo abbiamo solo stampato — non l'abbiamo mai salvato.
Quindi devi salvare il risultato:
name = " rafi "
clean_name = name.strip().upper()
print(clean_name)RAFIOppure riassegnalo allo stesso nome — name = name.strip(). Questo errore, chiamare un metodo e buttare via il risultato, capita a tutti all'inizio. E non produce alcun errore, ed è proprio per questo che ci si mette un po' a notarlo.
Metodi utili
raw = " Rafi Ahmed "
print(raw.strip())
print(raw.strip().lower())
print(raw.strip().upper())
print(raw.strip().replace(" ", "_"))
print(len(raw), len(raw.strip()))
print("rafi" in raw.lower())Rafi Ahmed
rafi ahmed
RAFI AHMED
Rafi_Ahmed
14 10
Truestrip()— rimuove gli spazi all'inizio e alla fine (non quelli in mezzo)lower()/upper()— cambia le maiuscole e le minuscolereplace(a, b)— sostituisce conbogni occorrenza diain— dice se un pezzo di testo è contenuto in un altro
E split() spezza il testo in pezzi:
full_name = "Rafi Ahmed Khan"
parts = full_name.split(" ")
print(parts)
print(parts[0])
print(len(parts))['Rafi', 'Ahmed', 'Khan']
Rafi
3Ciò che sta tra parentesi quadre è una lista, che avrà un suo capitolo più avanti nel corso. Per ora basta sapere che split() restituisce i pezzi in quella forma, e che un indice ne estrae uno.
Pulisci prima di confrontare. Se un utente scrive"Rafi ", non è uguale a"rafi"— uno spazio finale e una lettera maiuscola creano due differenze. Per questo, prima di confrontare,.strip().lower()è quasi un'abitudine universale nei progetti reali.
f-string — il modo semplice per costruire un messaggio
Finora mescolare testo e numeri è stato macchinoso. Una f-string lo rende semplice: una f davanti alla virgoletta, e tutto ciò che vuoi dentro le parentesi graffe {}:
name = "Rafi"
items = 3
price = 12.5
print(f"Hello, {name}!")
print(f"{items} items cost {items * price}")
print(f"Rounded: {items * price:.2f}")Hello, Rafi!
3 items cost 37.5
Rounded: 37.50Nota tre vantaggi: puoi fare calcoli dentro le graffe (items * price), non devi pensare ai tipi (i numeri diventano testo da soli), e :.2f fissa il numero di cifre decimali — cosa che serve a ogni visualizzazione di un importo di denaro.
Guarda cosa succede quando si dimentica la f:
name = "Rafi"
print("Hello, {name}")Hello, {name}Nessun errore, solo un messaggio sbagliato. Averlo visto una volta rende facile riconoscerlo in seguito.
Un esempio completo
account.py:
# Turn a raw form entry into a clean display name and a login id
raw_input_name = " Rafi Ahmed "
domain = "example.com"
clean = raw_input_name.strip()
parts = clean.split(" ")
first_name = parts[0]
last_name = parts[-1]
login_id = f"{first_name.lower()}.{last_name.lower()}"
email = f"{login_id}@{domain}"
initials = f"{first_name[0]}{last_name[0]}"
print(f"Display name : {clean}")
print(f"Login id : {login_id}")
print(f"Email : {email}")
print(f"Initials : {initials}")
print(f"Name length : {len(clean)} characters")Display name : Rafi Ahmed
Login id : rafi.ahmed
Email : [email protected]
Initials : RA
Name length : 10 charactersPerché parts[-1]? Perché il nome di una persona può avere tre parti. Prendere l'ultimo pezzo partendo da dietro funziona sia con due parti sia con tre.
Quando qualcosa va storto
IndexError: string index out of range L'indice richiesto è oltre la fine del testo. Ricorda che se len(word) vale 6, gli indici validi vanno da 0 a 5. Per l'ultimo carattere, word[-1] è la scrittura più sicura.
TypeError: 'str' object does not support item assignment Hai provato a cambiare un carattere dentro il testo. Non è possibile — costruisci invece un nuovo testo, ad esempio word = "R" + word[1:].
Ho chiamato il metodo ma non è cambiato nulla Il risultato non è stato salvato da nessuna parte. name.strip() non modifica name; ti serve name = name.strip().
strip() non rimuove gli spazi in mezzo strip() lavora solo alle due estremità. Per rimuovere quelli interni usa replace(" ", "").
Il messaggio della f-string esce sbagliato Controlla la f immediatamente prima della virgoletta. Senza di essa, le graffe vengono stampate come normali caratteri.
NameError — il nome dentro la f-string è sconosciuto Quello che hai scritto dentro le graffe non è mai stato creato, oppure è scritto male.
Passo 4 di 6 — Prevedi
Verifica cosa hai capito
Qual è l'output di queste quattro righe?
word = "PYTHON"
print(word[0])
print(word[-1])
print(word[1:4])- AP N YTH
- BY N YTHO
- CP O YTH
- DP N YTHO
Il codice doveva stampare Hello, RAFI!, ma il nome esce in minuscolo e con ancora gli spazi attorno. Perché?
name = " rafi "
name.strip()
name.upper()
print(f"Hello, {name}!")- AUn metodo può essere chiamato una sola volta su un testo, non due
- BUna f-string non può mostrare il risultato di un metodo
- C`strip()` e `upper()` non modificano l'originale — restituiscono nuovo testo, quindi il risultato va riassegnato a `name`
- D`strip()` non può essere chiamato prima di `upper()`; l'ordine va invertito
Cosa stampa questa f-string?
item = "pen"
qty = 3
price = 12.5
print(f"{qty} x {item} = {qty * price:.2f}")- A3 x pen = 37.50
- B3 x pen = 37.5
- C{qty} x {item} = {qty * price}
- D3 x pen = 3 * 12.5
Per rispondere serve un account
Accedi per verificare le tue risposte
Le domande sono qui sopra, e ragionarci a mente è la parte che conta. Accedi per vedere le risposte, le spiegazioni e i suggerimenti a tre livelli.
Tocca a te
Scrivi un file chiamato slug.py che trasforma un titolo in una forma adatta a un indirizzo web.
Valore di partenza: title = " Learn Python Step By Step "
L'output dovrebbe essere:
Title : Learn Python Step By Step
Slug : learn-python-step-by-step
Slug length: 25Quattro condizioni:
- Rimuovi gli spazi extra alle due estremità
- Converti tutto in minuscolo
- Sostituisci gli spazi interni con trattini
- Stampa tutte e tre le righe con le f-string
Poi fai una cosa in più: cambia title in " Python for Beginners " ed eseguilo. Se il nuovo titolo esce giusto senza che tu tocchi il codice, vuol dire che hai scritto un vero calcolo invece di digitare a mano le risposte.
In questa missione c’è di più
Quello che hai letto sopra è la missione completa: non è stato tagliato nulla. Pro aggiunge:
- Cosa succede davvero dietro le quinte: come Python lo esegue
- La soluzione completa dell’esercizio, svolta passo per passo
- Esercizi extra più difficili
- La domanda da colloquio su questo argomento, con una risposta modello
Passo 6 di 6
Sfida — il quiz del capitolo
Dieci domande dalla più facile alla più difficile. Le ultime sono difficili di proposito.
Accedi per fare il quiz