¿Cómo puedo leer las entradas como números?
¿Por qué hay cadenas x
y en y
lugar 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
TLDR
- Python 3 no evalúa los datos recibidos con la
input
función, pero sí lainput
función de Python 2 (lea la siguiente sección para comprender la implicación). - El equivalente de Python 2 de Python 3
input
es laraw_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
que no evalúa los datos y los devuelve como están, en forma de cadena. Pero, input
evaluará 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 + 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, por lo que el resultado también será del mismo int
tipo. Por lo tanto, la conversión de tipos se realiza de forma gratuita y 22
se devuelve como resultado input
y se almacena en data
variable. Puede pensar input
en 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 utilice input
Python 2.x. Expliqué por qué uno debe tener cuidado al usarlo, en esta respuesta .
Pero, raw_input
no 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 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'>)
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 int
s, 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 int
funció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 float
lugar 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 play
variable usando break
y while True
.
En Python 3.x, raw_input
se cambió el nombre a input
y input
se eliminó Python 2.x.
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ándolos en int
:
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
Para varios enteros en una sola línea, map
podrí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())
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: "))
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.
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"))
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.
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.
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
Mientras que en su ejemplo, int(input(...))
hace el truco, en cualquier caso, python-future
's builtins.input
vale 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 input
tratar de ser 'inteligente' sobre el tipo de datos de entrada ( builtins.input
básicamente sólo se comporta como raw_input
).