TLDR
- Python 3 non valuta i dati ricevuti con la
input
funzione, ma la input
funzione di Python 2 lo fa (leggi la sezione successiva per capire le implicazioni).
- L'equivalente di Python 2 di Python 3
input
è la raw_input
funzione.
Python 2.x
C'erano due funzioni per ottenere l'input dell'utente, chiamato input
e raw_input
. La differenza tra loro è, raw_input
non valuta i dati e ritorna così com'è, in forma di stringa. Tuttavia, input
valuterà qualunque cosa tu abbia inserito e il risultato della valutazione verrà restituito. Per esempio,
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
I dati 5 + 17
vengono valutati e il risultato è 22
. Quando valuta l'espressione 5 + 17
, rileva che stai aggiungendo due numeri e quindi anche il risultato sarà dello stesso int
tipo. Pertanto, la conversione del tipo viene eseguita gratuitamente e 22
viene restituita come risultato input
e archiviata in una data
variabile. Puoi pensare a input
come raw_input
composto con una eval
chiamata.
>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Nota: prestare attenzione quando si utilizza input
Python 2.x. Ho spiegato perché uno dovrebbe stare attento quando lo si utilizza, in questa risposta .
Ma raw_input
non valuta l'input e ritorna così com'è, come una stringa.
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)
Python 3.x
Python 3.x input
e Python 2.x raw_input
sono simili e raw_input
non sono disponibili in Python 3.x.
>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)
Soluzione
Per rispondere alla tua domanda, poiché Python 3.x non valuta e converte il tipo di dati, devi convertire esplicitamente in int
s, con int
, in questo modo
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Puoi accettare numeri di qualsiasi base e convertirli direttamente in base-10 con la int
funzione, in questo modo
>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365
Il secondo parametro indica qual è la base dei numeri immessi, quindi internamente lo capisce e lo converte. Se i dati inseriti sono errati, verrà lanciato un ValueError
.
>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'
Per i valori che possono avere un componente frazionario, il tipo sarebbe float
invece di int
:
x = float(input("Enter a number:"))
A parte questo, il tuo programma può essere leggermente modificato, in questo modo
while True:
...
...
if input("Play again? ") == "no":
break
È possibile eliminare la play
variabile utilizzando break
e while True
.