TLDR
- Python 3 no evalúa los datos recibidos con la
input
función, pero la input
función de Python 2 sí (lea la siguiente sección para comprender la implicación).
- El equivalente de Python 2 a Python 3
input
es la raw_input
función.
Python 2.x
Había dos funciones para obtener la entrada del usuario, llamadas input
y raw_input
. La diferencia entre ellos es, raw_input
no evalúa los datos y regresa como es, en forma de cadena. Pero, input
evaluará lo que haya ingresado y se devolverá el resultado de la evaluación. Por ejemplo,
>>> 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'>)
Los datos 5 + 17
se evalúan y el resultado es 22
. Cuando evalúa la expresión 5 + 17
, detecta que está agregando dos números y, por lo tanto, el resultado también será del mismo int
tipo. Por lo tanto, la conversión de tipo se realiza de forma gratuita y 22
se devuelve como resultado de input
y almacenada en data
variable. Puedes pensar input
como el raw_input
compuesto con una eval
llamada.
>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Nota: debe tener cuidado cuando esté usando input
Python 2.x. Le expliqué por qué uno debe tener cuidado al usarlo, en esta respuesta .
Pero, raw_input
no evalúa la entrada y regresa como es, como una cadena.
>>> 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.xy input
Python 2.x raw_input
son similares y raw_input
no están disponibles en 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'>)
Solución
Para responder a su pregunta, dado que Python 3.x no evalúa ni convierte el tipo de datos, debe convertir explícitamente a int
s, con int
, de esta manera
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Puede aceptar números de cualquier base y convertirlos directamente a base-10 con la int
función, como esta
>>> 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
El segundo parámetro dice cuál es la base de los números ingresados y luego internamente lo comprende y lo convierte. Si los datos ingresados son incorrectos, arrojará 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'
Para valores que pueden tener un componente fraccionario, el tipo sería float
más que int
:
x = float(input("Enter a number:"))
Aparte de eso, su programa se puede cambiar un poco, así
while True:
...
...
if input("Play again? ") == "no":
break
Puede deshacerse de la play
variable usando break
y while True
.