¿Por qué son x
y y
cadenas en lugar de ints en el siguiente código?
(Nota: en Python 2.x uso raw_input()
. En Python 3.x uso 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
python
python-3.x
python-2.7
input
int
smci
fuente
fuente
Respuestas:
TLDR
input
función, pero lainput
función de Python 2 sí (lea la siguiente sección para comprender la implicación).input
es laraw_input
función.Python 2.x
Había dos funciones para obtener la entrada del usuario, llamadas
input
yraw_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,Los datos
5 + 17
se evalúan y el resultado es22
. Cuando evalúa la expresión5 + 17
, detecta que está agregando dos números y, por lo tanto, el resultado también será del mismoint
tipo. Por lo tanto, la conversión de tipo se realiza de forma gratuita y22
se devuelve como resultado deinput
y almacenada endata
variable. Puedes pensarinput
como elraw_input
compuesto con unaeval
llamada.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.Python 3.x
Python 3.xy
input
Python 2.xraw_input
son similares yraw_input
no están disponibles en Python 3.x.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, conint
, de esta maneraPuede aceptar números de cualquier base y convertirlos directamente a base-10 con la
int
función, como estaEl 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
.Para valores que pueden tener un componente fraccionario, el tipo sería
float
más queint
:Aparte de eso, su programa se puede cambiar un poco, así
Puede deshacerse de la
play
variable usandobreak
ywhile True
.fuente
eval
funcionaría, pero no lo hagas a menos que tengas razones apremiantes.ast.literal_eval
para eso. No tiene las preocupaciones de seguridad deeval
.int(input()
... ¿en la parte superior? Python 2 está llegando al final de su vida útil y la información de Python 3 está demasiado enterrada IMOEn Python 3.x,
raw_input
se le cambió el nombreinput
yinput
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 hacer explícitamente esas entradas en números enteros poniéndolos en
int
:fuente
Para un entero múltiple en una sola línea,
map
podría ser mejor.Si el número ya se conoce (como 2 enteros), puede usar
fuente
input()
(Python 3) yraw_input()
(Python 2) siempre devuelven cadenas. Convierta el resultado a entero explícitamente conint()
.fuente
Varias preguntas requieren la entrada de varios enteros en una sola línea. La mejor manera es ingresar toda la cadena de números una línea y luego dividirlos en enteros. Aquí hay una versión de Python 3:
También se puede utilizar una lista de comprensión
Y para convertir todas las entradas de cadena a int hacemos lo siguiente
imprimirá los elementos de la lista en línea recta.
fuente
Convierte a enteros:
De manera similar para números de coma flotante:
fuente
el ciclo for se ejecutará 'n' número de veces. la segunda 'n' es la longitud de la matriz. la última declaración asigna 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.
fuente
Encontré un problema al tomar una entrada entera al resolver un problema en CodeChef , donde dos enteros, separados por espacio, deberían leerse desde una línea.
Si bien
int(input())
es suficiente para un solo entero, no encontré una forma directa de ingresar dos enteros. Intenté esto:Ahora uso num1 y num2 como enteros. Espero que esto ayude.
fuente
i
destruye cuandofor
se sale del bucle?@hosch250
Cuando se sale de un bucle, el valor de la variable de índice (aquíi
) permanece. Probé esta pieza y funciona correctamente.num1, num2 = map(int, input().split())
si sabe cuántos enteros encontrará onums = list(map(int, input().split()))
si no.fuente
Mientras que en su ejemplo,
int(input(...))
hace el truco, en cualquier caso,python-future
'sbuiltins.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 deinput
tratar de ser 'inteligente' sobre el tipo de datos de entrada (builtins.input
básicamente sólo se comporta comoraw_input
)fuente