HOWTO · Python
Entrada de usuario de bucle while de Python
Podemos usar la función input() dentro de un ciclo while para ingresar datos hasta que se cumpla una determinada condición en Python.
En esta página
Usa input() de Python dentro de un bucle while cuando un programa de línea de comandos deba volver a preguntar hasta que el usuario escriba una palabra o una opción del menú. Lee cada respuesta como texto, comprueba si significa «continuar» o «detenerse» y conviértela en un número solo después de verificar que sea válida.
Cómo funciona la función input()
En Python 3, input() muestra el mensaje, espera hasta que el usuario pulse Intro y devuelve la línea introducida como una cadena. El valor devuelto es texto incluso si parece numérico: por ejemplo, escribir 12 produce la cadena "12", no el entero 12. Conviértelo con int() o float() solo si la siguiente operación necesita un número.
En un programa interactivo sencillo, redacta un mensaje descriptivo para que el usuario sepa qué debe escribir. Puedes comparar una respuesta como texto, guardarla o pasarla a una función de conversión. Una llamada a input() lee una línea; colocarla dentro de un bucle permite que el programa recopile respuestas repetidamente. Este es un ejemplo de una sola pregunta y respuesta antes de añadir un bucle:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from io import StringIO
import sys
sys.stdin = StringIO("Ada\n")
name = input("What is your name? ")
print("Hello,", name)
What is your name? Hello, Ada
El ejemplo proporciona Ada mediante la entrada estándar, por lo que se ejecuta sin esperar a que alguien escriba en el teclado. En una terminal interactiva, omite las líneas de StringIO y sys.stdin; entonces, input() espera a que el usuario escriba un nombre y pulse Intro, y el saludo aparece en la línea siguiente.
Cómo usar un bucle while para solicitar entradas continuamente
Un centinela es un valor que indica al bucle que debe detenerse, como done. Inicializa el valor antes del bucle para que la condición pueda comprobarse desde la primera iteración. En cada pasada, lee una respuesta nueva y actualiza ese valor; cuando coincide con el centinela, la siguiente comprobación de la condición termina el bucle. Elige un centinela distinto de los datos válidos y compáralo de forma coherente (por ejemplo, normaliza las mayúsculas y minúsculas si también quieres que DONE detenga el bucle).
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
responses = iter(["red", "blue", "done"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
answer = ""
while answer != "done":
answer = read_response("Enter a color (done to finish): ")
if answer != "done":
print("Saved:", answer)
Enter a color (done to finish): red
Saved: red
Enter a color (done to finish): blue
Saved: blue
Enter a color (done to finish): done
Este ejemplo proporciona una secuencia fija mediante read_response, de modo que la interacción se pueda repetir. En un programa de terminal, sustituye esa llamada por input("Enter a color (done to finish): ") y conserva la comparación con el centinela y la estructura del bucle. El bucle lee el centinela, pero no lo guarda. Si omites la actualización, la condición puede seguir siendo verdadera indefinidamente; por eso, en cada pasada que continúe, debes obtener una respuesta nueva.
Cómo validar las entradas
Lee la respuesta como texto y comprueba el centinela de salida antes de convertirla. Coloca int() dentro de un bloque try/except ValueError y deja que el bucle vuelva a preguntar si falla la conversión. Este ejemplo autocontenido usa una secuencia fija para mostrar los casos de entrada válida, inválida y de salida; en un programa de terminal interactivo, sustituye read_response(...) por input(...).
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
responses = iter(["oops", "7", "exit"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
while True:
text = read_response("Enter an integer (exit to finish): ").strip()
if text.lower() == "exit":
break
try:
number = int(text)
except ValueError:
print("Please enter a whole number.")
continue
print("Accepted:", number)
Enter an integer (exit to finish): oops
Please enter a whole number.
Enter an integer (exit to finish): 7
Accepted: 7
Enter an integer (exit to finish): exit
El centinela se comprueba antes de llamar a int(), por lo que exit termina el bucle sin intentar ninguna conversión. Después de un ValueError, continue vuelve a mostrar la pregunta, mientras que los números enteros válidos llegan a la rama de aceptación. Un texto decimal como 3.5 no es un entero; usa float() si la tarea admite valores decimales. Llamar a strip() permite espacios en blanco al principio o al final, y lower() hace que la comparación con el centinela no distinga entre mayúsculas y minúsculas.
Cómo crear un programa controlado por un menú
Un bucle de menú muestra opciones, lee cada elección como texto, realiza la acción correspondiente y se repite hasta que se selecciona la opción explícita de salida. El ejemplo suma o resta dos enteros; sus respuestas fijas incluyen una opción no reconocida, ambas operaciones y la opción de salida. En un programa de terminal, sustituye read_response(...) por input(...) y añade la misma validación de enteros que se mostró antes si los usuarios pueden introducir operandos arbitrarios.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
responses = iter(["x", "1", "4", "5", "2", "9", "3", "3"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
while True:
print("1) Add 2) Subtract 3) Exit")
choice = read_response("Choice: ")
if choice == "3":
print("Goodbye.")
break
elif choice == "1":
left = int(read_response("First number: "))
right = int(read_response("Second number: "))
print("Result:", left + right)
elif choice == "2":
left = int(read_response("First number: "))
right = int(read_response("Second number: "))
print("Result:", left - right)
else:
print("Choose 1, 2, or 3.")
1) Add 2) Subtract 3) Exit
Choice: x
Choose 1, 2, or 3.
1) Add 2) Subtract 3) Exit
Choice: 1
First number: 4
Second number: 5
Result: 9
1) Add 2) Subtract 3) Exit
Choice: 2
First number: 9
Second number: 3
Result: 6
1) Add 2) Subtract 3) Exit
Choice: 3
Goodbye.
La rama de salida se ejecuta antes de preguntar por cualquiera de los operandos, y una elección no reconocida muestra instrucciones antes del siguiente menú. Cada operación válida lee dos operandos y muestra el resultado. Puedes adaptar esta misma estructura para llamar a funciones, actualizar ajustes o mostrar información; también puedes trasladar la validación compartida a una función auxiliar.
Entrada de Python 2 en código heredado
Python 2 es un entorno de ejecución heredado; llegó al fin de su vida útil el 1 de enero de 2020, según el aviso de retirada de Python 2 de la Python Software Foundation. En Python 2, raw_input() lee una línea y devuelve texto, mientras que input() evalúa la expresión introducida. Esto difiere de Python 3, donde input() devuelve texto. Al mantener código antiguo de Python 2 que espera texto, la función pertinente es raw_input(); no apliques a ese código la suposición sobre el comportamiento de input() en Python 3. Para los programas nuevos, usa Python 3 y su función input().