¿Cómo puedo leer las entradas como números?
¿ Por qué hay cadenas x
y y
en lugar de enteros en el siguiente código?
(Nota: en Python 2.x se usa raw_input()
. En Python 3.x se usa input()
. raw_input()
se cambió el nombre input()
a Python 3.x)
play = True
while play:
x = input("Enter a number: ")
y = input("Enter a number: ")
print(x + y)
print(x - y)
print(x * y)
print(x / y)
print(x % y)
if input("Play again? ") == "no":
play = False
Desde Python 3, input
devuelve una cadena a la que debes convertir explícitamente int
, como esta
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Puedes aceptar números de cualquier base como este.
>>> 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 le dice la base del número y luego internamente la entiende y la convierte. Si los datos ingresados son incorrectos arrojará un archivo 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
en lugar de int
:
x = float(input("Enter a number:"))
Diferencias entre Python 2 y 3
Resumen
- La función de Python 2
input
evaluó los datos recibidos, convirtiéndolos implícitamente en un número entero (lea la siguiente sección para comprender las implicaciones), peroinput
la función de Python 3 ya no hace eso. - El equivalente de Python 2 a Python 3
input
es laraw_input
función.
Pitón 2.x
Había dos funciones para obtener la entrada del usuario, llamadas input
y raw_input
. La diferencia entre ellos es que raw_input
no evalúa los datos y los devuelve tal como están, 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ás sumando dos números y por lo tanto el resultado también será del mismo int
tipo. Entonces, la conversión de tipo se realiza de forma gratuita y 22
se devuelve como resultado de input
y se almacena en la data
variable. Se puede considerar input
como 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 utilice input
Python 2.x. En esta respuesta expliqué por qué hay que tener cuidado al usarlo .
Pero raw_input
no evalúa la entrada y devuelve tal como está, 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'>)
Pitón 3.x
Python 3.x input
y 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'>)
En Python 3.x, raw_input
se cambió el nombre a input
Python 2.x y input
se eliminó.
Esto significa que, al igual que raw_input
, input
en Python 3.x siempre devuelve un objeto de cadena.
Para solucionar el problema, debe convertir explícitamente esas entradas en números enteros colocándolas en int
:
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))