Recibir datos de quien usa tu programa
Leer lo que escribe alguien con input(), por qué siempre es un str y qué errores aparecen al convertirlo con int() y float().
¿Cómo quieres aprender?
El problema que vamos a resolver
Hasta ahora, todos los programas tenían sus números escritos dentro del archivo. Para ejecutarlo con otros números había que abrir el archivo y editarlo.
Los programas reales no funcionan así. Un programa pregunta, y quien lo usa responde.
En Python, preguntar es trabajo de input(). Cuesta un minuto aprenderlo. Pero trae una regla que atrapa a todo programador nuevo al menos una vez: lo que devuelve input() siempre es texto —aunque la persona haya escrito un número perfectamente válido—. Si no conoces esa regla, basta para romper tu primer programa de cálculo.
Al terminar este capítulo podrás
- Leer lo que escribe alguien con
input(), mostrando una pregunta clara - Explicar por qué la entrada es siempre un
str - Convertirla en número con
int()yfloat() - Distinguir un
TypeError, unValueErrory una respuesta incorrecta sin error - Limpiar la entrada para que un espacio de más no rompa tu programa
Requisitos previos: Trabajar con texto — indexado, slices y f-strings.
Cómo funciona input()
name = input("What is your name? ")
print(f"Hello, {name}!")Ejecútalo:
What is your name? Rafi
Hello, Rafi!Pasaron tres cosas. input() mostró la pregunta que va entre paréntesis; luego se detuvo y esperó hasta que la persona escribió algo y pulsó Enter; por último devolvió lo escrito, y lo guardamos en name.
Fíjate en el espacio al final de la pregunta —"What is your name? "—. Sin él, lo que escriba la persona quedaría pegado al signo de interrogación y se vería mal.
Estos programas hay que ejecutarlos en la terminal.input()espera a que alguien escriba, así que no funciona en una web ni en el panel de vista previa de un editor. Ejecutapython ask.pyen tu propia terminal —que es como funciona todo este curso de todos modos.
La regla que atrapa a todos una vez
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'str'>
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 3, in <module>
print("Next year:", age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strLa persona escribió 22. La pantalla muestra un número. Y type(age) dice str. (La línea File muestra la ruta completa de tu archivo, así que en tu equipo se verá distinta.)
La razón tiene sentido si lo piensas: un teclado produce caracteres, no números. Alguien podría escribir 22, o abc, o 12.5. input() podría adivinar —«eso parece numérico, lo convierto»—, pero entonces la misma línea de código devolvería a veces un str y otras veces un int, y nunca sabrías de antemano cuál. Así que Python mantiene una sola regla: siempre texto. Convertirlo es tarea tuya.
int() y float()
age = input("Your age: ")
age = int(age)
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'int'>
Next year: 23Los dos pasos caben en una línea, y así es como suele escribirse:
age = int(input("Your age: "))
print("Next year:", age + 1)Léelo de dentro hacia fuera: input() produjo texto, int() lo convirtió en un número entero, y el resultado fue a parar a age.
Para decimales, float():
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))Price: 249.50
With tax: 286.92Cuál usar: int para lo que se cuenta (edades, recuentos, cantidades), float para lo que se mide (precios, kilos, promedios).
Dos errores, y una equivocación que no lanza ningún error
Cuando se olvida la conversión o la entrada no es válida, pueden pasar tres cosas distintas. Los nombres son fáciles de confundir, así que míralos uno al lado del otro.
TypeError — el tipo es incorrecto. Olvidaste la conversión e intentaste sumar un número a un texto:
qty = input("Quantity: ")
print(qty + 2)Quantity: 3
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 2, in <module>
print(qty + 2)
~~~~^~~
TypeError: can only concatenate str (not "int") to strqty contiene el texto "3", y + con texto solo puede unir otro trozo de texto, no un número. Python no adivina si querías sumar o unir —así que se detiene.
Ningún error, solo una respuesta incorrecta. Ahora escribe * en vez de +, todavía sin la conversión:
qty = input("Quantity: ")
print(qty * 2)Quantity: 3
33Esta vez no hay ningún error. "3" * 2 significa el texto dos veces —"33". El programa se ejecutó y la respuesta es incorrecta. Una respuesta incorrecta en silencio es peor que un error, porque nada te detiene para avisarte.
ValueError — el tipo es correcto, pero el texto no es un número:
age = int(input("Your age: "))Your age: twenty
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 1, in <module>
age = int(input("Your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'int() está dispuesto a hacer el trabajo, solo que no con 'twenty'. El mensaje incluso nombra el valor problemático, entre comillas al final.
Una trampa sutil pero muy real:
count = int(input("Count: "))Escribe 12.5 y esto también lanza ValueError —porque int() no acepta texto con punto decimal. Si pueden existir decimales, léelo con float() y convierte a int() después si lo necesitas.
Todavía no tenemos todo lo necesario para evitar estos errores —eso requiere condiciones y bucles, y ambos llegan en los próximos capítulos. Por ahora, reconoce el error y aprende a leer el mensaje.
Limpia la entrada
La gente escribe espacios de más y mezcla mayúsculas. Los métodos del capítulo anterior son justo lo que hace falta:
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()
print(f"Name is {full_name}")
print(f"Answer is {answer}")Name: rafi ahmed
Continue? (yes/no) YES
Name is Rafi Ahmed
Answer is yesAcostúmbrate a usar .strip() con todo lo que venga de input(). No hay razón para que un programa se rompa por un espacio de más.
Un ejemplo completo
bill.py:
# Ask for one order and print a small bill
print("--- Order entry ---")
customer = input("Customer name : ").strip().title()
item = input("Item : ").strip()
quantity = int(input("Quantity : "))
unit_price = float(input("Unit price : "))
subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax
print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total : {total:.2f}")--- Order entry ---
Customer name : rafi ahmed
Item : notebook
Quantity : 4
Unit price : 85.50
--- Bill ---
Customer : Rafi Ahmed
Item : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total : 359.10Cuatro entradas, cuatro tratamientos distintos: el nombre se limpia y se pone en mayúsculas iniciales, el artículo solo se limpia, la cantidad se convierte en número entero y el precio en decimal. Para cada entrada tienes que decidir dos cosas: qué tipo necesitas y cómo limpiarla.
Cuando algo falla
TypeError: can only concatenate str (not "int") to str Falta la conversión. Escribe int(input(...)) o float(input(...)).
Quería multiplicar, pero el texto se repite "3" * 2 da "33". El valor nunca se convirtió a int. Este error es peligroso justamente porque no aparece ningún mensaje —ante la duda, imprime type().
ValueError: invalid literal for int() with base 10 Lo que escribió la persona no es un número entero: es una palabra, un decimal o nada en absoluto (solo Enter). Si pueden existir decimales, usa float().
El programa se queda ahí, sin mostrar nada Está esperando tu entrada. Si no le das una pregunta a input(), no aparece nada en pantalla y parece bloqueado. Pon siempre una pregunta.
input() no funciona dentro de mi editor Algunos editores y entornos en línea no permiten escribir una entrada. Abre una terminal y ejecuta python bill.py.
Hay una línea en blanco de más después de pulsar Enter input() toma tu texto y no conserva el salto de línea final. Una línea en blanco de más casi seguro viene de un print() tuyo.
Paso 4 de 6 — Predice
Comprueba lo que has entendido
La persona escribe 42 y pulsa Enter. ¿Qué imprime la segunda línea?
value = input("Number: ")
print(type(value))- A<class 'input'>
- B<class 'int'>
- C<class 'float'>
- D<class 'str'>
La persona escribió 3 y el programa imprimió Doubled: 33, sin ningún error. ¿Por qué, y qué lo arregla?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- AEscribir `qty + qty` en vez de `qty * 2` lo arreglaría
- BEl `print` necesita un `+` en lugar de una coma
- C`input()` no puede leer números, así que hace falta otra función
- D`qty` es un `str`, y multiplicar texto por un número lo repite: hace falta `int(qty) * 2`
¿Qué pasa si la persona escribe 12.5?
count = int(input("Count: "))
print(count + 1)- AUn `ValueError`: `int()` no acepta texto con punto decimal; léelo con `float()` si pueden existir decimales
- B`count` pasa a ser `12`, porque `int()` corta todo lo que hay después del punto
- CUn `TypeError`, porque la entrada y los tipos de las variables no coinciden
- D`count` pasa a ser `13`, porque `int()` redondea al entero más cercano
Para responder necesitas una cuenta
Inicia sesión para comprobar tus respuestas
Las preguntas están arriba, y resolverlas mentalmente es lo que de verdad importa. Inicia sesión para ver las respuestas, las explicaciones y las pistas de tres niveles.
Tu turno
Escribe un archivo llamado travel.py que haga cuatro preguntas y muestre un pequeño cálculo:
- El nombre del pasajero (limpio, con mayúsculas iniciales)
- Cuántos pasajeros (un número entero)
- La tarifa por pasajero (un decimal)
- El porcentaje de descuento (un decimal)
Luego muestra el total de la tarifa, el importe del descuento y la cantidad final a pagar —las tres con dos decimales.
Cuando funcione, intenta romperlo tres veces a propósito:
- Escribe
twocomo número de pasajeros —¿qué error aparece y qué dice el mensaje? - Escribe
2.5como número de pasajeros —¿qué pasa, y por qué? - Pon algunos espacios antes y después del nombre —¿sobrevive la salida?
Si la respuesta a la última es sí, ya estás escribiendo mejor código que el principiante promedio. Las soluciones para las otras dos llegan cuando tengas condiciones y bucles.
Esta misión tiene más
Lo que has leído arriba es la misión completa: no se ha recortado nada. Pro añade:
- Qué ocurre realmente por debajo: cómo ejecuta Python esto
- La solución completa del ejercicio, resuelta paso a paso
- Ejercicios extra más difíciles
- La pregunta de entrevista sobre este tema, con una respuesta modelo
Paso 6 de 6
Reto — el quiz del capítulo
Diez preguntas de fácil a difícil. Las últimas son difíciles a propósito.
Inicia sesión para hacer el quiz