Nella lezione precedente abbiamo imparato a stampare delle stringhe dal programma mediante la funzione
print()
. Ora vedremo come immettere dei dati nel programma mediante la tastiera del computer.
Apriamo un nuovo file nell'editor e scriviamo:
# QUESTO PROGRAMMA FA UN SALUTO PERSONALIZZATO
nome = input("Come ti chiami? ")
print("Ciao", nome)
Lanciando il programma vedremo che ci chiederà (in IDLE) "Come ti chiami?" . Digitiamo il nostro nome e premiamo Invio. Questo dovrebbe essere il risultato ("Come ti chiami?" e "Ciao Luigi" sono scritti dal programma, mentre "Luigi" è la risposta dell'utente).
Come ti chiami?
Luigi
Ciao Luigi
La funzione input()
prende come argomento opzionale una stringa. La funzione stampa
l'argomento e si ferma attendendo che l'utente digiti qualcosa. Quando l'utente preme Invio la funzione restituisce
una stringa che contiene i caratteri scritti dall'utente.
La stringa che forniamo come argomento è di solito un prompt, cioè una domanda del tipo "Scrivi un
numero" o "Come ti chiami?". Possiamo ometterla, ma in questo caso il programma si fermerà senza scrivere nulla,
probabilmente disorientando l'utente. Il valore restituito da
input()
viene di solito immagazzinato in una variabile.
Ora dovrebbe essere facile capire cosa fa il programma: la input()
stampa il prompt
"Come ti chiami? "
poi si ferma e attende che noi scriviamo il nostro nome e premiamo Invio.
Quello che abbiamo scritto viene assegnato alla variabile nome
, che poi viene stampata
nell'istruzione successiva. Notate che la input()
non va a capo e non lascia spazi dopo aver
stampato il prompt, quindi è necessario inserire uno spazio alla fine della stringa per separare
la domanda dalla risposta.
Come ti chiami? Peppe
Come si chiama la tua mamma? Giuseppina
Giuseppina e' la mamma di Peppe
SOLUZIONI
Ribadiamo che la funzione input()
restituisce una stringa che contiene i
caratteri che abbiamo immesso. E' facile fare errori concettuali di questo tipo:
a = input("Scrivi un numero ")
print("Il doppio di", a, "e'", 2 * a)
print("Il quadrato di", a, "e'", a ** 2)
Proviamo a lanciare il programma ed alla richiesta digitiamo, ad esempio, 5. Cosa succede? Orrore: la
prima print()
scrive che il doppio di 5 è 55, mentre la seconda addirittura manda in crash
il programma provocando un TypeError!
Questo comportamento si spiega se ripensiamo al fatto che ogni variabile ha un tipo di
dato associato ad essa: nella prima istruzione assegnamo ad a
non il numero
5 ma la stringa "5" (cioè una stringa che contiene il carattere 5). Quindi nella
seconda istruzione, quando Python trova l'espressione 2 * a
, esegue non la moltiplicazione di
due numeri, ma la moltiplicazione di un numero per una stringa (ottenendo la concatenazione "55").
Nella terza istruzione si ottiene infine un errore perchè non è possibile fare il quadrato di una stringa.
Per ovviare a queste situazioni esistono delle apposite funzioni di conversione:
Le funzioni int()
e float()
prendono un argomento di qualsiasi tipo
e restituiscono un numero intero o float ottenuto dal dato di partenza.
A noi, per il momento, interessa soprattutto convertire stringhe in numeri: quindi, ad esempio,
"10"
è una stringa formata dai due caratteri 1 e 0, mentre int("10")
converte la stringa nel numero intero 10. E' necessario che la stringa sia interpretabile come un numero
(intero o float), altrimenti otterremo un errore.
Per fare qualche esempio dell'uso di queste funzioni conviene scrivere in IDLE (in modo da avere una risposta immediata senza bisogno di lanciare un programma)
>>> a = "10" >>> b = "20" >>> a + b
'1020'
>>> int(a) + int(b)
30
>>> c = "3.14" >>> float(c)
3.14
>>> int(c)
Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> int(c) ValueError: invalid literal for int() with base 10: '3.14'
>>> c = "mamma" >>> int(c)
Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> int(c) ValueError: invalid literal for int() with base 10: 'mamma'
Commentiamo quello che abbiamo scritto: dapprima abbiamo assegnato ad a
e
b
le due stringhe "10"
e "20"
; la prima volta, facendo
l'addizione otteniamo 1020
, cioè la loro concatenazione. La seconda volta invece
sommiamo i valori interi ottenuti dalle stringhe ed in effetti il risultato è 30. Poi proviamo a
convertire la stringa "3.14"
in un numero float ed il risultato è ok. Se invece
tentiamo di convertirla in un intero otteniamo un errore perchè
Python trova il punto decimale. Analogamente se tentiamo di convertire in intero la stringa
"mamma"
Notate la sottigliezza: non otteniamo un TypeError (cioè un errore nel tipo di dato)
perchè è perfettamente lecito chiamare int()
con una stringa (cioè "mamma"
)
come argomento. Invece otteniamo un nuovo tipo di errore ValueError
(errore nel valore dell'argomento) perchè la funzione capisce che la stringa che le abbiamo dato è
impossibile da convertire.
Torniamo quindi al nostro programma doppio_quadrato.py
e modifichiamo la prima
linea così:
a = float(input("Scrivi un numero "))
(attenti alle due parentesi chiuse!) Così tutto funziona, perchè float()
trasforma la stringa ritornata da input()
in un numero, che viene assegnato ad a
.
L'unico problema è che dovremo stare attenti al tipo di numero in cui vogliamo convertire il
valore: int
o float
. In genere se dobbiamo accettare sia numeri interi
che con la virgola conviene usare float()
che funziona in entrambi i casi. Se invece
vogliamo esplicitamente un numero intero, possiamo usare int()
che, come abbiamo visto,
provoca un errore se scriviamo un numero con il punto decimale.
doppio_quadrato.py
in modo che scriva anche il
cubo del numero immesso.operazioni.py
: Scrivere un programma che chieda in input
due numeri (float) e stampi la loro somma e il loro prodotto.Vediamo un altro esempio.
print("CONVERSIONE METRI - FEET")
m = float(input("Immettere i metri "))
ft = m / 0.3048
print(m, "m =", ft, "ft")
Dovrebbe ormai esservi chiaro come funziona il programma. Prendendolo come modello possiamo fare molti esercizi simili:
CALCOLO DELL'AREA DI UN RETTANGOLO
base = 20
altezza = 15
L'area del rettangolo e' 300
ESERCIZIO 6.5 Simile al 6.4: Calcolare l'area di un triangolo o di un cerchio (assumere
π = 3.1415)0.0 Celsius corrispondono a 32.0 Fahreneit
0.0 Celsius corrispondono a 273.15 Kelvin
SOLUZIONI
Fine della lezione