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

Dec 08 2013

¿Por qué hay cadenas xy en ylugar de ints en el siguiente código?

(Nota: en Python 2.x use raw_input(). En Python 3.x use input(). raw_input()Se renombró input()en 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

Respuestas

328 thefourtheye Dec 08 2013 at 10:08

TLDR

  • Python 3 no evalúa los datos recibidos con la inputfunción, pero sí la inputfunción de Python 2 (lea la siguiente sección para comprender la implicación).
  • El equivalente de Python 2 de Python 3 inputes la raw_inputfunción.

Python 2.x

Había dos funciones para obtener la entrada del usuario, llamadas inputy raw_input. La diferencia entre ellos es raw_inputque no evalúa los datos y los devuelve como están, en forma de cadena. Pero, inputevaluará lo que ingresó 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, por lo que el resultado también será del mismo inttipo. Por lo tanto, la conversión de tipos se realiza de forma gratuita y 22se devuelve como resultado inputy se almacena en datavariable. Puede pensar inputen el 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. Expliqué por qué uno debe tener cuidado al usarlo, en esta respuesta .

Pero, raw_inputno evalúa la entrada y regresa 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'>)

Python 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'>)

Solución

Para responder a su pregunta, dado que Python 3.x no evalúa y convierte el tipo de datos, debe convertir explícitamente a ints, con int, así

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 intfunción, así

>>> 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 entiende 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 los valores que pueden tener un componente fraccionario, el tipo sería en floatlugar de 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 playvariable usando breaky while True.

47 Noname Dec 08 2013 at 10:09

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

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ándolos en int:

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
29 user1341043 Nov 11 2014 at 07:32

Para varios enteros en una sola línea, mappodría ser mejor.

arr = map(int, raw_input().split())

Si el número ya se conoce (como 2 enteros), puede usar

num1, num2 = map(int, raw_input().split())
18 MartijnPieters Dec 08 2013 at 10:09

input()(Python 3) y raw_input()(Python 2) siempre devuelven cadenas. Convierta el resultado en entero explícitamente con int().

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
12 gumboy Jul 08 2014 at 07:13

Varias preguntas requieren la entrada de varios números enteros en una sola línea. La mejor manera es ingresar la cadena completa de números en una línea y luego dividirlos en números enteros. Aquí hay una versión de Python 3:

a = []
p = input()
p = p.split()      
for i in p:
    a.append(int(i))

También se puede utilizar una lista de comprensión

p = input().split("whatever the seperator is")

Y para convertir todas las entradas de cadena a int hacemos lo siguiente

x = [int(i) for i in p]
print(x, end=' ')

imprimirá los elementos de la lista en línea recta.

6 HemanthSavasere Apr 17 2016 at 23:20

Convertir a números enteros:

my_number = int(input("enter the number"))

De manera similar para los números de punto flotante:

my_decimalnumber = float(input("enter the number"))
4 ravitanwar Aug 03 2018 at 23:30
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

el bucle for se ejecutará 'n' veces. la segunda 'n' es la longitud de la matriz. la última declaración mapea los enteros a una lista y toma la entrada en forma separada por espacios. también puede devolver la matriz al final del ciclo for.

3 Aravind May 23 2014 at 18:32

Encontré un problema al tomar la entrada de números enteros al resolver un problema en CodeChef , donde dos números enteros, separados por espacio, deben leerse en una línea.

Si bien int(input())es suficiente para un solo entero, no encontré una forma directa de ingresar dos números enteros. Probé esto:

num = input()
num1 = 0
num2 = 0

for i in range(len(num)):
    if num[i] == ' ':
        break

num1 = int(num[:i])
num2 = int(num[i+1:])

Ahora uso num1 y num2 como enteros. Espero que esto ayude.

3 Sanyal Jun 30 2015 at 16:16
def dbz():
    try:
        r = raw_input("Enter number:")
        if r.isdigit():
            i = int(raw_input("Enter divident:"))
            d = int(r)/i
            print "O/p is -:",d
        else:
            print "Not a number"
    except Exception ,e:
        print "Program halted incorrect data entered",type(e)
dbz()

Or 

num = input("Enter Number:")#"input" will accept only numbers
2 TobiasKienzler Nov 23 2016 at 19:19

Mientras que en su ejemplo, int(input(...))hace el truco, en cualquier caso, python-future's builtins.inputvale la pena considerar, ya que asegura que su código funciona tanto para Python 2 y 3 y el comportamiento predeterminado desactiva de python2 de inputtratar de ser 'inteligente' sobre el tipo de datos de entrada ( builtins.inputbásicamente sólo se comporta como raw_input).