Una idea que puedes terminar

Tu primer proyecto de Python empieza pequeño

Cinco proyectos con un resultado concreto, una versión mínima y una siguiente mejora. Elige según lo que ya sabes y construye un analizador de gastos con código completo.

5 proyectos con una rutaUn ejemplo completoBiblioteca estándar

¿Qué proyecto de Python elegir si eres principiante?

Elige un problema cuyo resultado puedas comprobar a mano. Tu primera versión debería aceptar pocos datos, producir una salida clara y funcionar sin servicios externos. Después puedes añadir archivos, una interfaz o más reglas.

Si todavía te cuesta escribir una función sin mirar una solución, empieza por los ejercicios de funciones. Para ejecutar programas con archivos de tu equipo, sigue la guía de instalación.

Proyecto 01 · Funciones

Conversor de temperaturas

Resultado: convertir una temperatura de Celsius a Fahrenheit y devolver un número. No necesitas una interfaz gráfica para que sea un proyecto completo.

Versión mínima: una función convertir(celsius) y tres ejemplos de ejecución. Su entrada es un número; su salida, el cálculo celsius * 9 / 5 + 32.

  1. Escribe la conversión como una función sin input.
  2. Comprueba que 0 °C son 32 °F, 100 °C son 212 °F y −40 °C son −40 °F.
  3. Añade una capa separada que pida el valor y muestre el resultado.

Siguiente mejora: conversión inversa y un mensaje para texto no numérico. Mantén el cálculo separado de la lectura del teclado.

Repasa: variables y parámetros y retorno.

Proyecto 02 · Bucles y decisiones

Cuestionario con puntuación

Resultado: presentar tres preguntas y contar respuestas correctas. Guarda cada pregunta, sus opciones y la respuesta esperada en un diccionario.

Versión mínima: una lista de preguntas y una función que compare la respuesta recibida con la esperada. La función de corrección debe poder probarse sin teclado.

  1. Crea tres preguntas con una sola respuesta correcta.
  2. Recorre la lista con un bucle y suma un punto por cada acierto.
  3. Muestra el resultado como «2 de 3», sin dividir si la lista está vacía.

Comprueba: todas correctas, todas incorrectas, respuestas con espacios y cero preguntas. Decide si aceptas mayúsculas y documenta esa regla.

Siguiente mejora: leer las preguntas desde JSON. Evita añadir temporizadores antes de tener la corrección bien probada.

Repasa: for, condiciones y diccionarios.

Proyecto 03 · Datos y acumuladores

Analizador de gastos por categoría

Resultado: sumar gastos de ejemplo y obtener un total por categoría. Más abajo tienes una versión completa que puedes ejecutar en el navegador.

Versión mínima: recibe una lista de gastos, cada uno con categoria e importe, y devuelve dos resultados: el total y un diccionario de subtotales.

  1. Representa tres gastos con sus importes como texto decimal.
  2. Acumula cada importe en su categoría con Decimal.
  3. Comprueba una lista vacía y un gasto negativo.

Siguiente mejora: cargar un archivo JSON y validar campos ausentes. Usa datos inventados mientras desarrollas; no necesitas conectar una cuenta bancaria.

Repasa: diccionarios y excepciones.

Proyecto 04 · Persistencia

Lista de tareas que recuerda tus cambios

Resultado: añadir tareas, verlas y marcarlas como completadas; conservarlas en tareas.json al cerrar el programa.

Versión mínima: una lista de diccionarios con id, titulo y completada. El ID debe identificar una tarea aunque su posición en la lista cambie.

  1. Implementa primero añadir y completar en memoria.
  2. Separa las funciones cargar_tareas y guardar_tareas.
  3. Si el archivo todavía no existe, empieza con una lista vacía. Si está dañado, informa del error antes de sobrescribirlo.

Comprueba: cerrar y abrir conserva los datos; completar un ID inexistente muestra un resultado claro; dos tareas con el mismo título tienen identidades diferentes.

Siguiente mejora: filtros de pendientes y completadas. Tienes una ruta más extensa en el proyecto de aplicación CLI.

Proyecto 05 · Archivos

Inventario de archivos por extensión

Resultado: leer una carpeta de prueba y mostrar cuántos archivos hay por extensión. La versión mínima solo lee nombres y no mueve ni elimina archivos.

  1. Crea una carpeta con dos archivos .txt, uno .csv y un archivo sin extensión.
  2. Recorre sus hijos directos con Path.iterdir() y descarta directorios.
  3. Normaliza la extensión a minúsculas y cuenta con un diccionario.

Comprueba: una carpeta vacía, extensiones en mayúsculas y archivos sin extensión. En esta versión no se recorren subcarpetas.

Siguiente mejora: guardar el inventario en CSV. El ejemplo completo está en automatizar tareas con Python.

Repasa: rutas con pathlib.

Proyecto completo: analizador de gastos paso a paso

1. Define los datos y el contrato

Cada gasto tendrá una categoría no vacía y un importe escrito como texto, por ejemplo "12.50". Aquí aceptamos importes finitos, no negativos y con un máximo de dos decimales; un importe inválido produce ValueError. Los campos ausentes quedan fuera de este primer contrato.

La función devuelve un total y un diccionario por categoría. Usamos Decimal creado desde texto para representar cantidades decimales exactas. No creamos los importes a partir de números float.

2. Calcula sin mezclar la salida

La función no imprime y no pide datos. Esto permite comprobar sus resultados en una prueba, usarla en otro programa o añadir después una interfaz.

analizador_gastos.py · programa completo
from decimal import Decimal, InvalidOperation


def resumir_gastos(gastos):
    por_categoria = {}
    total = Decimal("0.00")
    for gasto in gastos:
        categoria = gasto["categoria"].strip()
        try:
            importe = Decimal(gasto["importe"])
        except InvalidOperation:
            raise ValueError("Importe no válido") from None
        if not categoria:
            raise ValueError("La categoría está vacía")
        if not importe.is_finite() or importe < 0:
            raise ValueError("El importe debe ser finito y no negativo")
        if importe.as_tuple().exponent < -2:
            raise ValueError("Usa como máximo dos decimales")
        anterior = por_categoria.get(categoria, Decimal("0.00"))
        por_categoria[categoria] = anterior + importe
        total += importe
    return total, por_categoria


gastos = [
    {"categoria": "comida", "importe": "12.50"},
    {"categoria": "transporte", "importe": "3.20"},
    {"categoria": "comida", "importe": "7.30"},
]
total, categorias = resumir_gastos(gastos)
assert total == Decimal("23.00")
assert categorias["comida"] == Decimal("19.80")
assert resumir_gastos([]) == (Decimal("0.00"), {})
try:
    resumir_gastos([{"categoria": "comida", "importe": "-1.00"}])
except ValueError:
    pass
else:
    raise AssertionError("Falta rechazar importes negativos")

print(f"Total: {total:.2f} €")
for categoria, importe in sorted(categorias.items()):
    print(f"{categoria}: {importe:.2f} €")
Resultado esperado
Total: 23.00 €
comida: 19.80 €
transporte: 3.20 €

3. Prueba antes de ampliar

Añade un gasto nuevo y calcula a mano su efecto. Prueba también una categoría con espacios, un importe "NaN" y un importe con tres decimales. Comprueba que los dos últimos se rechazan.

4. Guarda datos, no objetos Decimal

Cuando añadas JSON, conserva los importes como textos. El módulo json no serializa objetos Decimal automáticamente. Convierte y valida al entrar en la función, y aplica formato al mostrar el resultado.

Para trabajar con tablas externas, continúa con el proyecto de análisis de datos del curso.

Cómo terminar tu primer proyecto

  • Describe su entrada y salida en dos frases.
  • Incluye un ejemplo que otra persona pueda ejecutar.
  • Comprueba un caso normal, uno vacío y uno inválido.
  • Separa cálculos de lectura de datos y presentación.
  • Escribe qué funciona y qué dejarás para la siguiente versión.

Un proyecto terminado no necesita todas las ideas que se te ocurran. Guarda las mejoras en una lista y elige solo una después de estabilizar la primera versión.

Preguntas frecuentes sobre proyectos de Python

¿Necesito saber clases para hacer un proyecto?

No para estas versiones. Puedes combinar funciones, listas y diccionarios. Las clases tienen sentido cuando te ayudan a organizar un modelo que ya entiendes.

¿Puedo hacer estos proyectos en el navegador?

El conversor, la lógica del cuestionario y el analizador de ejemplo pueden ejecutarse en el editor online. Para guardar datos entre sesiones y leer carpetas reales, utiliza Python en tu equipo.

¿Cómo evito quedarme bloqueado a mitad del proyecto?

Reduce el problema a una función con una entrada de ejemplo. Comprueba esa función antes de añadir teclado, archivos o menús. Si no puedes describir la salida esperada, concreta primero el requisito.

Convierte el proyecto en una herramienta útil

Prueba un flujo sencillo con archivos de una carpeta de práctica.

Automatizar una tarea →

Fuentes y compatibilidad

Los ejemplos usan Python 3 y la biblioteca estándar. Las instrucciones de instalación se contrastaron con la documentación oficial; los ejemplos de código se verifican con las comprobaciones de estas guías.

Consulta la metodología y las versiones del editor.