Ricevere input da chi usa il tuo programma
Leggere ciò che una persona digita con input(), capire perché è sempre una str, e quali errori compaiono quando lo converti con int() e float().
Come vuoi imparare?
Il problema che stiamo risolvendo
Fino a ora, ogni programma aveva i suoi numeri scritti dentro il file. Per farlo girare con numeri diversi, bisognava aprire il file e modificarlo.
I programmi veri non funzionano così. Un programma chiede, e chi lo usa risponde.
In Python, chiedere è compito di input(). Si impara in un minuto. Ma ha una regola che fa inciampare ogni nuovo programmatore almeno una volta: qualunque cosa restituisca input() è sempre testo — anche quando la persona ha digitato un numero perfettamente valido. Non conoscere questa sola regola basta a rompere il tuo primo programma di calcolo.
Alla fine di questo capitolo sarai in grado di
- Leggere quello che una persona digita con
input(), mostrando una domanda chiara - Spiegare perché l'input è sempre un
str, cioè testo - Convertirlo in un numero con
int()efloat() - Distinguere un
TypeError, unValueErrore una risposta sbagliata senza alcun errore - Pulire l'input, così che uno spazio in più non rompa il programma
Prerequisiti: Lavorare con il testo — indici, slice e f-string.
Come funziona input()
name = input("What is your name? ")
print(f"Hello, {name}!")Eseguilo:
What is your name? Rafi
Hello, Rafi!Sono successe tre cose. input() ha mostrato la domanda tra parentesi; poi si è fermato e ha aspettato che la persona digitasse qualcosa e premesse Invio; infine ha restituito quanto digitato, e noi lo abbiamo salvato in name.
Nota lo spazio alla fine della domanda — "What is your name? ". Senza, quello che la persona scrive finirebbe attaccato al punto interrogativo e sembrerebbe sbagliato.
Questi programmi vanno eseguiti nel terminale.input()aspetta che qualcuno scriva, quindi non funziona su un sito web né nel riquadro di anteprima di un editor. Eseguipython ask.pynel tuo terminale — che è comunque il modo in cui funziona tutto questo corso.
La regola che fa inciampare tutti una volta
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'str'>
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 3, in <module>
print("Next year:", age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strLa persona ha digitato 22. Lo schermo mostra un numero. E type(age) dice str. (La riga File mostra il percorso completo del tuo file, quindi sul tuo computer sarà diversa.)
Il motivo ha senso se ci pensi: una tastiera produce caratteri, non numeri. Qualcuno potrebbe digitare 22, oppure abc, oppure 12.5. input() avrebbe potuto indovinare — "sembra un numero, lo converto" — ma allora la stessa riga di codice restituirebbe a volte una str e altre volte un int, e non potresti mai sapere in anticipo quale. Quindi Python mantiene una sola regola: sempre testo. Convertire è compito tuo.
int() e float()
age = input("Your age: ")
age = int(age)
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'int'>
Next year: 23I due passaggi stanno su una riga sola, ed è così che di solito si scrive:
age = int(input("Your age: "))
print("Next year:", age + 1)Leggilo da dentro a fuori: input() ha prodotto testo, int() lo ha trasformato in un numero intero, e il risultato è finito in age.
Per i decimali, si usa float():
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))Price: 249.50
With tax: 286.92Quale usare: int per ciò che si conta (età, quantità, numero di pezzi), float per ciò che si misura (prezzi, pesi, medie).
Due errori, e uno sbaglio che non dà alcun errore
Quando la conversione viene dimenticata o l'input è sbagliato, possono succedere tre cose diverse. I nomi si confondono facilmente, quindi guardali affiancati.
TypeError — il tipo è sbagliato. Hai dimenticato la conversione e hai provato a sommare un numero a un testo:
qty = input("Quantity: ")
print(qty + 2)Quantity: 3
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 2, in <module>
print(qty + 2)
~~~~^~~
TypeError: can only concatenate str (not "int") to strqty contiene il testo "3", e + su un testo può solo unire un altro pezzo di testo, non un numero. Python non indovina se volevi sommare o unire — quindi si ferma.
Nessun errore — solo una risposta sbagliata. Ora scrivi * al posto di +, sempre senza la conversione:
qty = input("Quantity: ")
print(qty * 2)Quantity: 3
33Questa volta non c'è nessun errore. "3" * 2 significa il testo ripetuto due volte — "33". Il programma è girato e la risposta è sbagliata. Una risposta sbagliata in silenzio è peggio di un errore, perché niente ti ferma per dirti che qualcosa non va.
ValueError — il tipo è giusto, ma il testo non è un numero:
age = int(input("Your age: "))Your age: twenty
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 1, in <module>
age = int(input("Your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'int() è disposto a fare il lavoro, solo non con 'twenty'. Il messaggio nomina addirittura il valore sbagliato, tra virgolette alla fine.
Una trappola sottile ma molto reale:
count = int(input("Count: "))Digita 12.5 e anche questo solleva un ValueError — perché int() non accetta un testo che contiene un punto decimale. Se sono possibili dei decimali, leggilo con float() e converti in int() dopo, se ti serve.
Non abbiamo ancora tutto il necessario per prevenire questi errori — serve sia le condizioni sia i cicli, e arrivano entrambi nei prossimi capitoli. Per ora, riconosci l'errore e impara a leggere il messaggio.
Pulire l'input
Le persone scrivono spazi in più e mescolano maiuscole e minuscole. I metodi del capitolo precedente sono proprio ciò che serve:
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()
print(f"Name is {full_name}")
print(f"Answer is {answer}")Name: rafi ahmed
Continue? (yes/no) YES
Name is Rafi Ahmed
Answer is yesFai di .strip() un'abitudine su tutto ciò che arriva da input(). Non c'è motivo che un programma si rompa per uno spazio in più.
Un esempio completo
bill.py:
# Ask for one order and print a small bill
print("--- Order entry ---")
customer = input("Customer name : ").strip().title()
item = input("Item : ").strip()
quantity = int(input("Quantity : "))
unit_price = float(input("Unit price : "))
subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax
print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total : {total:.2f}")--- Order entry ---
Customer name : rafi ahmed
Item : notebook
Quantity : 4
Unit price : 85.50
--- Bill ---
Customer : Rafi Ahmed
Item : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total : 359.10Quattro input, quattro trattamenti diversi: il nome viene pulito e reso con le iniziali maiuscole, l'articolo solo pulito, la quantità convertita in un numero intero, il prezzo in un numero decimale. Per ogni input devi decidere due cose — di quale tipo ha bisogno, e come pulirlo.
Quando qualcosa va storto
TypeError: can only concatenate str (not "int") to str Manca la conversione. Scrivi int(input(...)) o float(input(...)).
Volevo moltiplicare, ma il testo si ripete "3" * 2 dà "33". Il valore non è mai stato convertito in int. Questo bug è pericoloso proprio perché non compare nessun errore — nel dubbio, stampa type().
ValueError: invalid literal for int() with base 10 Quello che la persona ha digitato non è un numero intero — una parola, un decimale, o niente del tutto (solo Invio). Se sono possibili dei decimali, usa float().
Il programma sta lì fermo e non mostra nulla Sta aspettando il tuo input. Se a input() non passi una domanda, sullo schermo non compare niente e sembra bloccato. Passa sempre una domanda.
input() non funziona dentro il mio editor Alcuni editor e alcuni blocchi online non accettano input. Apri un terminale ed esegui python bill.py.
Dopo aver premuto Invio compare una riga vuota in più input() prende il tuo testo e non conserva il ritorno a capo finale. Una riga vuota in più viene quasi certamente da un print() scritto da te.
Passo 4 di 6 — Prevedi
Verifica cosa hai capito
La persona digita 42 e preme Invio. Cosa stampa la seconda riga?
value = input("Number: ")
print(type(value))- A<class 'input'>
- B<class 'int'>
- C<class 'float'>
- D<class 'str'>
La persona ha digitato 3 e il programma ha stampato Doubled: 33, senza nessun errore. Perché, e cosa lo risolve?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- AScrivere `qty + qty` invece di `qty * 2` lo risolverebbe
- BLa `print` ha bisogno di un `+` al posto della virgola
- C`input()` non sa leggere i numeri, quindi serve un'altra funzione
- D`qty` è una `str`, e moltiplicare un testo per un numero lo ripete — serve `int(qty) * 2`
Cosa succede se la persona digita 12.5?
count = int(input("Count: "))
print(count + 1)- AUn `ValueError` — `int()` non accetta un testo con il punto decimale; usa `float()` se sono possibili i decimali
- B`count` diventa `12`, perché `int()` taglia tutto ciò che sta dopo il punto
- CUn `TypeError`, perché i tipi dell'input e della variabile non corrispondono
- D`count` diventa `13`, perché `int()` arrotonda al numero intero più vicino
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 travel.py che fa quattro domande e mostra un piccolo calcolo:
- Il nome del passeggero (pulito, con le iniziali maiuscole)
- Quanti passeggeri (un numero intero)
- La tariffa per passeggero (un decimale)
- La percentuale di sconto (un decimale)
Poi stampa il costo totale del viaggio, l'importo dello sconto e l'importo finale da pagare — tutti e tre con due cifre decimali.
Quando funziona, prova a romperlo tre volte apposta:
- Digita
twocome numero di passeggeri — quale errore compare, e cosa dice il messaggio? - Digita
2.5come numero di passeggeri — cosa succede, e perché? - Metti qualche spazio prima e dopo il nome — l'output resiste?
Se la risposta all'ultima è sì, stai già scrivendo codice migliore della media dei principianti. Le correzioni per le altre due arrivano quando avrai le condizioni e i cicli.
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