【Copia y Pega para Ejecutar】¡Creemos una Aplicación de Lista de Tareas Simple con Python! (Basada en Texto)
Para ejecutar Python desde el símbolo del sistema o PowerShell en tu PC, necesitas descargar e instalar Python.
Si aún no lo has hecho, consulta el artículo Instalación de Python y configuración del entorno de desarrollo para instalar Python.
¡Hola! Hace solo unos meses no sabía nada de programación, y ahora estoy compartiendo lo que he aprendido creando sitios web junto a una IA.
Esta vez, vamos a crear una "Aplicación de Lista de Tareas" (ToDo List) en Python, algo que recomiendo encarecidamente como primer paso en el aprendizaje de la programación. ¡El objetivo de este artículo es solo uno! Que experimentes la emoción de "¡El programa que hice por mi cuenta funciona!".
¡Dejemos la teoría complicada para después! Primero, juguemos con el código que puedes copiar y pegar para sentir ese "¡Ah, así es como funciona!". Explicaré los términos técnicos de la forma más sencilla posible, basándome en mis propias experiencias y tropiezos, ¡así que no te preocupes!
¡Primero, ejecutemos el producto final!
¡Ver para creer! Primero, ejecutemos la versión final de la aplicación de lista de tareas. Copia todo el código de abajo, crea un archivo llamado todo.py, y pégalo dentro para guardarlo.
# -*- coding: utf-8 -*-
TASKS_FILE = "tasks.txt"
def load_tasks():
"""Función para cargar tareas desde el archivo"""
try:
with open(TASKS_FILE, "r", encoding="utf-8") as f:
# strip() para eliminar el carácter de nueva línea al final de cada línea
tasks = [line.strip() for line in f.readlines()]
except FileNotFoundError:
# Si el archivo no existe, devuelve una lista vacía
tasks = []
return tasks
def save_tasks(tasks):
"""Función para guardar tareas en el archivo"""
with open(TASKS_FILE, "w", encoding="utf-8") as f:
# Añade un salto de línea al final de cada tarea al escribir
for task in tasks:
f.write(task + "\n")
def list_tasks(tasks):
"""Función para mostrar una lista de las tareas"""
if not tasks:
print("✅ Aún no hay tareas.")
return
print("--- Lista de Tareas ---")
# Usa enumerate para obtener el índice (número) y la tarea al mismo tiempo
for i, task in enumerate(tasks):
print(f"{i + 1}: {task}")
print("---------------------")
def add_task(tasks):
"""Función para añadir una tarea"""
task = input("Introduce la tarea a añadir: ")
if task:
tasks.append(task)
save_tasks(tasks)
print(f"✨ Tarea '{task}' añadida.")
else:
print("⚠️ No se ha introducido ninguna tarea.")
def delete_task(tasks):
"""Función para eliminar una tarea"""
list_tasks(tasks)
if not tasks:
return
try:
# Pedir al usuario que elija una tarea por su número
num_str = input("Introduce el número de la tarea a eliminar: ")
num = int(num_str)
# El usuario cuenta desde 1, pero el índice de la lista es desde 0, así que ajustamos
if 1 <= num <= len(tasks):
removed_task = tasks.pop(num - 1)
save_tasks(tasks)
print(f"🗑️ Tarea '{removed_task}' eliminada.")
else:
print("⚠️ No existe ninguna tarea con ese número.")
except ValueError:
# Manejo de error si se introduce algo que no es un número
print("⚠️ Por favor, introduce un número válido.")
def main():
"""Función para ejecutar el proceso principal"""
tasks = load_tasks()
while True:
print("\n¿Qué te gustaría hacer?")
command = input("1:Listar, 2:Añadir, 3:Eliminar, 9:Salir > ")
if command == "1":
list_tasks(tasks)
elif command == "2":
add_task(tasks)
elif command == "3":
delete_task(tasks)
elif command == "9":
print("👋 Saliendo de la aplicación. ¡Buen trabajo!")
break
else:
print("⚠️ Por favor, introduce 1, 2, 3 o 9.")
if __name__ == "__main__":
main()
Una vez guardado, abre tu terminal (o Símbolo del sistema/PowerShell en Windows), navega al directorio donde guardaste el archivo y ejecuta el siguiente comando:
python todo.py
¿Qué tal ha ido? ¿Te preguntó "¿Qué te gustaría hacer?"? Prueba a introducir "2" para añadir una tarea, "1" para ver la lista y "3" para eliminar una. Puedes salir de la aplicación introduciendo "9". ¡Increíble, ya es una aplicación en toda regla!
A partir de aquí, desvelemos juntos qué es lo que hace realmente este conjuro mágico (el código).
Paso 1: Una versión súper simple con solo "Añadir" y "Listar"
Intentar entenderlo todo de golpe puede ser abrumador. Empecemos con una versión mucho más simple del código, centrándonos solo en el corazón de la aplicación: las funciones de añadir y listar tareas.
# Prepara una lista vacía (como un array) para guardar las tareas
tasks = []
# Repite el proceso infinitamente
while True:
print("\n¿Qué te gustaría hacer?")
command = input("1:Listar, 2:Añadir, 9:Salir > ")
if command == "1":
print("--- Lista de Tareas ---")
for task in tasks:
print(task)
print("---------------------")
elif command == "2":
task = input("Introduce la tarea a añadir: ")
tasks.append(task)
print(f"✨ Tarea '{task}' añadida.")
elif command == "9":
print("👋 Saliendo de la aplicación.")
break # Sale del bucle
else:
print("⚠️ Por favor, introduce 1, 2 o 9.")
Este breve fragmento de código contiene los fundamentos de la programación.
tasks = []: Esta es la "lista" para guardar las tareas. Imagina que estás preparando una caja vacía al principio.while True:: Esto es un "bucle infinito". Seguirá esperando las órdenes del usuario hasta que se introduzca un "9". Este fue el conjuro mágico que la IA me enseñó cuando le pregunté por primera vez "¿cómo hago que el programa se quede esperando?".input(...): Recibe los caracteres que el usuario escribe en el teclado.if / elif / else: Separa el proceso según el valor delcommandintroducido. Es una bifurcación condicional, como "si es 1, lista las tareas; si es 2, añade una tarea; si no...".tasks.append(task): Añade la tarea recibida deinputal final de la listatasks.for task in tasks:: Recorre el contenido de la listatasks, uno por uno desde el principio, lo guarda en una variable llamadatasky lo muestra en pantalla conprint(task).break: Este es el interruptor de escape para terminar el bucle infinito. Si lo olvidas, no tendrás más remedio que forzar el cierre del programa (¡a mí me pasó muchas veces!).
Paso 2: Añadir la función de "Eliminar" y el manejo de errores
A continuación, hagamos posible eliminar las tareas añadidas. Para que no sea incómodo, permitiremos que el usuario elija qué tarea eliminar mediante un número. ¡Aquí subimos un poco de nivel!
# ... (Sustituye la parte de `if command == "1":` del código del Paso 1 por lo siguiente) ...
if command == "1":
print("--- Lista de Tareas ---")
# Usar enumerate te permite obtener el número de la lista y el contenido a la vez
for i, task in enumerate(tasks):
# i empieza en 0, así que al mostrarlo le sumamos 1
print(f"{i + 1}: {task}")
print("---------------------")
# ... (Añade lo siguiente después de `elif command == "2":` en el código del Paso 1) ...
elif command == "3": # Añadir la función de eliminar
# Primero, muestra la lista actual para que el usuario elija más fácil
for i, task in enumerate(tasks):
print(f"{i + 1}: {task}")
try:
num_str = input("Introduce el número de la tarea a eliminar: ")
num = int(num_str) # Convierte el texto introducido a número
# pop() elimina el elemento de la lista en la posición (índice) especificada
removed_task = tasks.pop(num - 1)
print(f"🗑️ Tarea '{removed_task}' eliminada.")
except ValueError:
print("⚠️ Por favor, introduce un número válido.")
except IndexError:
print("⚠️ No existe ninguna tarea con ese número.")
Han aparecido algunos puntos nuevos.
enumerate(tasks): ¡Esto es súper útil! Cuando recorres una lista en un bucle, asigna automáticamente un número "0, 1, 2...". Gracias a esto, podemos mostrar las tareas con un número, como enf"{i + 1}: {task}".tasks.pop(num - 1): Esta es la clave de la eliminación.pop()elimina un elemento de una lista en la posición especificada. Ponemosnum - 1porque, aunque el usuario introduce "1", en el mundo de la programación (los índices de las listas) se empieza a contar desde "0", por lo que hay que restarle uno. ¡Este "empezar desde cero" es un punto que confunde a todos los principiantes en programación, así que conviene recordarlo!try / except: Este es el mecanismo de manejo de errores. Significa "intenta ejecutar el código dentro detry:, y si ocurre un error, atrápalo conexcept:y ejecuta este otro código en lugar de que el programa se cierre".ValueError:int()convierte texto en número, pero si se introduce un texto que no es numérico, como "a", se produce este error.IndexError: Este error se produce si intentas eliminar conpop()un número que no existe en la lista (por ejemplo, especificar "5" cuando solo hay 3 tareas).
Una regla de oro es que "los usuarios no operan como el desarrollador espera". Al incluir este tipo de manejo de errores, evitas que la aplicación se cierre inesperadamente y creas un programa más amigable y robusto.
Paso 3: Guardar los datos en un archivo para que no desaparezcan
Nuestra aplicación actual tiene una gran debilidad. Una vez que cierras el programa, todas las tareas que añadiste se borran. Así no sirve como lista de tareas, ¿verdad? Por eso, vamos a añadir una función para guardar las tareas en un archivo y cargarlas la próxima vez que se inicie.
# Decidir un nombre de archivo
TASKS_FILE = "tasks.txt"
# --- Definición de funciones ---
def load_tasks():
try:
# "r" es el modo de lectura (read)
with open(TASKS_FILE, "r", encoding="utf-8") as f:
# readlines() lee todas las líneas en una lista, y strip() elimina los saltos de línea
tasks = [line.strip() for line in f.readlines()]
except FileNotFoundError:
# La primera vez o si el archivo no existe, dará error, así que devolvemos una lista vacía
tasks = []
return tasks
def save_tasks(tasks):
# "w" es el modo de escritura (write). Si el archivo no existe, se creará.
with open(TASKS_FILE, "w", encoding="utf-8") as f:
for task in tasks:
# Al escribir en el archivo, añade un salto de línea (\n) al final de cada tarea
f.write(task + "\n")
# --- Proceso principal ---
# Al iniciar la app, primero carga las tareas del archivo
tasks = load_tasks()
# Cada vez que se añade o elimina una tarea, modifícalo para que llame a save_tasks(tasks)
# (Consulta el código completo del principio)
El punto clave aquí es la "lectura y escritura de archivos".
with open(...) as f:: Es la frase estándar para manejar archivos en Python. Al escribirlo así, te aseguras de que el archivo se cierre automáticamente después de leer o escribir, lo cual es más seguro. Tengo la experiencia de que cuando le pregunté a la IA: "Enséñame a manejar archivos de forma segura en Python", esto fue lo primero que me recomendó.- Modos ("r", "w"): El segundo argumento de
open()especifica cómo abrir el archivo."r"es para solo lectura (Read), y"w"es para solo escritura (Write). Hay que tener cuidado con el modo"w", ya que si el archivo ya existe, borrará todo su contenido antes de escribir. encoding="utf-8": Piensa en esto como un conjuro. Es necesario para manejar correctamente caracteres que no son del alfabeto inglés (como el español con sus tildes y la 'ñ') y, si se omite, puede causar que el texto se vea con caracteres extraños (mojibake).- Lectura (load):
f.readlines()lee el contenido del archivo en una lista, línea por línea. Sin embargo, cada línea incluye un carácter de nueva línea (\n) al final, por lo que usamosline.strip()para eliminarlo y tener datos limpios. - Escritura (save):
f.write()escribe texto en el archivo. Esta vez, al contrario, queremos guardar cada tarea en una línea separada, así que le añadimos el carácter de nueva línea\nal final de cada tarea. Si lo olvidas, todas las tareas se guardarán en una sola línea y no se podrán leer correctamente (¡yo estuve atascado con esto como 15 minutos!).
Y finalmente, como se muestra en el código completo del principio, agrupar los bloques de procesamiento usando def para crear "funciones" (a esto se le llama refactorizar) hace que el código sea mucho más limpio y fácil de entender. Cuando tu código empiece a alargarse, acostumbrarte a organizarlo en cajas (funciones) por cada funcionalidad te facilitará mucho la vida en el futuro.
Conclusión: ¡Si funciona, ganas! Y al siguiente paso
¡Buen trabajo! Ahora tienes el poder de crear tu propia aplicación de lista de tareas en Python. Lo importante no es entenderlo todo a la perfección, sino "primero, hacerlo funcionar, aunque sea copiando y pegando". Tener algo que funciona y modificarlo poco a poco, experimentando con "¿qué pasará si cambio esto?", es el camino más rápido para mejorar, y lo he vivido en carne propia.
Los errores no son algo a lo que temer, sino pistas para que tu programa sea aún mejor. Aunque no entiendas un mensaje de error, puedes pegarlo directamente en una IA y preguntar "¿qué significa este error y cómo lo arreglo?", y la mayoría de las veces te dará una solución.
¡Anímate a añadirle a la aplicación que hemos creado hoy una "función de editar tareas" o una "función para marcar tareas completadas" y haz que evolucione hasta convertirse en tu propia lista de tareas definitiva!
Siguientes pasos
Ahora que ya sabes crear una aplicación básica, ¿por qué no te atreves con los cálculos? A continuación, te enseñamos a crear una aplicación de calculadora simple que realiza las cuatro operaciones aritméticas básicas.
¡Vamos a crear una aplicación de calculadora con Python! (operaciones aritméticas)