6: LA FUNZIONE input()

L'INPUT DA TASTIERA

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.

NUOVO PROGRAMMA input_print.py

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.

ESERCIZIO 6.1 MAMMA E FIGLIO: Modificare il programma in modo da ottenere questo I/O (in questo esercizio e nei successivi l'output del programma è in nero e le risposte dell'utente sono in blu):
Come ti chiami? Peppe
Come si chiama la tua mamma? Giuseppina
Giuseppina e' la mamma di Peppe
SOLUZIONI

LE FUNZIONI int() E float()

Ribadiamo che la funzione input() restituisce una stringa che contiene i caratteri che abbiamo immesso. E' facile fare errori concettuali di questo tipo:

NUOVO PROGRAMMA doppio_quadrato.py

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.

ESERCIZIO 6.2: Modificare doppio_quadrato.py in modo che scriva anche il cubo del numero immesso.
ESERCIZIO 6.3 NUOVO PROGRAMMA operazioni.py: Scrivere un programma che chieda in input due numeri (float) e stampi la loro somma e il loro prodotto.
SOLUZIONI

Vediamo un altro esempio.

NUOVO PROGRAMMA: metri_feet.py

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:

ESERCIZIO 6.4 Scrivere un programma che dia questo I/O:
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)
ESERCIZIO 6.6: Scrivere un programma che chieda in input di immettere la temperatura in gradi Celsius e stampi il valore della stessa temperatura in gradi Fahrenheit e Kelvin. Le formule di conversione sono:
°F = °C x 1.8 + 32    K = °C + 273.15
Stampare in output un messaggio leggibile del tipo:
0.0 Celsius corrispondono a 32.0 Fahreneit
0.0 Celsius corrispondono a 273.15 Kelvin
SOLUZIONI

Fine della lezione