¿Cómo puedo leer las entradas como números?

Resuelto asked hace 10 años • 10 respuestas

¿ Por qué hay cadenas xy yen 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
 avatar Dec 08 '13 10:12
Aceptado

Desde Python 3, inputdevuelve 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 floaten lugar de int:

x = float(input("Enter a number:"))

Diferencias entre Python 2 y 3

Resumen

  • La función de Python 2 inputevaluó los datos recibidos, convirtiéndolos implícitamente en un número entero (lea la siguiente sección para comprender las implicaciones), pero inputla función de Python 3 ya no hace eso.
  • El equivalente de Python 2 a Python 3 inputes la raw_inputfunción.

Pitón 2.x

Había dos funciones para obtener la entrada del usuario, llamadas inputy raw_input. La diferencia entre ellos es que raw_inputno evalúa los datos y los devuelve tal como están, en forma de cadena. Pero inputevaluará 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 + 17se 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 inttipo. Entonces, la conversión de tipo se realiza de forma gratuita y 22se devuelve como resultado de inputy se almacena en la datavariable. Se puede considerar inputcomo raw_inputcompuesto con una evalllamada.

>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

Nota: Debe tener cuidado cuando utilice inputPython 2.x. En esta respuesta expliqué por qué hay que tener cuidado al usarlo .

Pero raw_inputno 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 inputy Python 2.x raw_inputson similares y raw_inputno 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'>)
thefourtheye avatar Dec 08 '2013 03:12 thefourtheye

En Python 3.x, raw_inputse cambió el nombre a inputPython 2.x y inputse eliminó.

Esto significa que, al igual que raw_input, inputen 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: "))
 avatar Dec 08 '2013 03:12