Lección 45 de 45 · Proyectos y cierre

Examen final y siguientes pasos

No vas a demostrar cuánto recuerdas de memoria. Vas a comprobar si puedes convertir un problema pequeño en datos, pasos, código y pruebas.

Paso a pasoTransferencia y autoevaluaciónAvanza a tu ritmo
Índice · Lección 45/45
Lección 45 · cierre del recorrido

Este examen no tiene trampas ni pretende medir velocidad. Puedes consultar tus apuntes y las lecciones anteriores. La habilidad que queremos observar es otra: saber qué necesitas hacer y avanzar de forma ordenada hasta una solución comprobable.

Evidencia de aprendizaje

Resolver un problema corto con menos ayuda y usar los errores para decidir qué parte del curso repasar.

Evalúa cuatro hábitos, no cuarenta y cinco temas de memoria

Si has llegado hasta aquí, no necesitas demostrar cada método de Python por separado. Busca estas cuatro capacidades:

  • Representar: elegir strings, números, listas o diccionarios que encajen con el problema.
  • Descomponer: dividir el trabajo en pasos y funciones pequeñas.
  • Comprobar: probar casos normales y algún límite.
  • Diagnosticar: cuando algo falla, localizar la causa sin cambiar todo a la vez.

Consultar cómo se escribe exactamente un método no invalida ninguna de esas habilidades. Programar no es competir contra la documentación.

Reto final: resume pedidos antes de escribir una sola línea

Imagina una pequeña tienda. Recibes una lista de pedidos y quieres obtener dos resultados: cuánto dinero suman los pedidos pagados y cuántos siguen pendientes.

Datos de entrada
pedidos = [
    {"importe": 20, "pagado": True},
    {"importe": 15, "pagado": False},
    {"importe": 12, "pagado": True},
]

Antes de programar, escribe mentalmente el plan:

  1. Recorrer cada pedido.
  2. Si está pagado, sumar su importe.
  3. Si no está pagado, aumentar el contador de pendientes.
  4. Devolver ambos resultados juntos.

Ese plan ya resuelve la parte más importante del problema. La sintaxis viene después.

Mira una solución y lee decisiones, no caracteres

Una posible implementación
def resumir_pedidos(pedidos):
    total_pagado = 0
    pendientes = 0

    for pedido in pedidos:
        if pedido["pagado"]:
            total_pagado += pedido["importe"]
        else:
            pendientes += 1

    return {"total_pagado": total_pagado, "pendientes": pendientes}

print(resumir_pedidos([
    {"importe": 20, "pagado": True},
    {"importe": 15, "pagado": False},
]))

Fíjate en las decisiones: dos acumuladores porque buscamos dos respuestas; un for porque procesamos todos los elementos; un if porque cada pedido pertenece a una de dos rutas; un diccionario de salida porque queremos devolver dos valores con nombre.

¿Y si yo lo haría con comprehensions?

También puede ser correcto. El examen no busca una sintaxis concreta: busca una solución que puedas explicar, comprobar y modificar sin perderte.

Evaluación en tres niveles de autonomía

Nivel 1 · leer y predecir

numeros = [2, 5, 8]
total = 0
for numero in numeros:
    if numero > 4:
        total += numero
print(total)

Sin ejecutar: ¿qué imprime y qué elementos contribuyen al total?

Comprobar

Imprime 13: se suman 5 y 8; el 2 no supera 4.

Nivel 2 · completar una solución parcial

Completa la función que resume pedidos. Hay estructura, pero las dos decisiones importantes siguen en tus manos.

Salida esperada
32
1
final_2.py
La salida aparecerá aquí.

Necesito una pista
  • En la rama pagada, el importe está en el diccionario pedido.
  • En la rama pendiente solo necesitas incrementar un contador.
Ver una solución razonada
def resumir_pedidos(pedidos):
    total_pagado = 0
    pendientes = 0
    for pedido in pedidos:
        if pedido["pagado"]:
            total_pagado += pedido["importe"]
        else:
            pendientes += 1
    return total_pagado, pendientes

pedidos = [
    {"importe": 20, "pagado": True},
    {"importe": 15, "pagado": False},
    {"importe": 12, "pagado": True},
]
print(*resumir_pedidos(pedidos), sep="\n")

Nivel 3 · resuelve desde un briefing

Opción A · inventario

Recibe productos con nombre y stock. Devuelve los nombres cuyo stock sea 0.

Opción B · notas

Recibe alumnos con nombre y nota. Devuelve cuántos tienen nota ≥ 5.

Elige una. El editor incluye datos de prueba, pero no incluye la estructura de la solución.

Opción A preparada: escribe sin_stock(productos) desde cero. Si prefieres la opción B, puedes sustituir el briefing y tus datos manualmente.

Salida esperada
['Lápiz', 'Regla']
final_3.py
La salida aparecerá aquí.

Necesito una pista
  • Empieza por la forma del resultado: necesitas una lista de nombres.
  • Recorre productos y añade el nombre solo cuando stock == 0.
Ver una solución razonada
productos = [
    {"nombre": "Cuaderno", "stock": 3},
    {"nombre": "Lápiz", "stock": 0},
    {"nombre": "Regla", "stock": 0},
]

def sin_stock(productos):
    resultado = []
    for producto in productos:
        if producto["stock"] == 0:
            resultado.append(producto["nombre"])
    return resultado

print(sin_stock(productos))

Rúbrica: usa el bloqueo para elegir el repaso

Si te costó…Repasa
elegir lista/diccionario o representar datos12–15
recorrer y decidir7–10
organizar una función y devolver resultado17–19
entender un fallo38–39
mantener el código claro40

Superar el examen no significa escribir de memoria. Significa poder explicar tu plan, producir una primera solución, probarla y corregirla con método.

Haz tres pruebas que te den confianza de verdad

Que el ejemplo anterior funcione no demuestra que la función esté bien en todos los casos. Prueba variaciones que cambien el camino del programa.

Casos que merece la pena imaginar
# 1. Ningún pedido
[]

# 2. Todos pagados
[{"importe": 5, "pagado": True}]

# 3. Todos pendientes
[{"importe": 5, "pagado": False}, {"importe": 7, "pagado": False}]

No necesitas memorizar una biblioteca de testing para pensar como alguien que prueba software. Pregúntate: “¿qué ruta de mi código todavía no he ejercitado?”.

Tu bloqueo indica dónde repasar; no borra lo que ya sabes

  • Si cuesta representar los pedidos, repasa listas y diccionarios.
  • Si cuesta recorrer y decidir, vuelve a for e if.
  • Si cuesta organizar la solución, revisa funciones y return.
  • Si el código casi funciona pero no sabes por qué falla, practica el método de depuración.
  • Si funciona pero te resulta difícil de leer, revisa nombres, funciones pequeñas y estilo.

Repasar una lección concreta es progreso. Empezar todo el curso desde cero por inseguridad suele ser menos útil que localizar la pieza que falta.

Después del curso, elige un camino que produzca cosas reales

Tu siguiente etapa debería aumentar la autonomía, no simplemente acumular más teoría. Elige una dirección durante unas semanas y construye proyectos pequeños relacionados con ella.

  • Automatización: archivos, carpetas, hojas de cálculo y tareas repetitivas.
  • Datos: limpieza, análisis y visualización. Si quieres aprender a consultar y transformar información almacenada en bases de datos, continúa con el curso de SQL desde cero de AprenderSQL.es; después podrás combinar SQL con herramientas de Python como pandas.
  • Web y APIs: HTTP, frameworks y pequeñas aplicaciones con una interfaz.
  • Python general: scripts, paquetes, testing y proyectos propios cada vez menos guiados.
Has terminado cuando…

puedes tomar un problema pequeño, describir los datos que necesita, dividirlo en pasos, escribir una primera solución, probarla y mejorarla cuando encuentras un fallo.

Eso no significa “saber todo Python”. Significa que ya tienes una base desde la que aprender lo siguiente construyendo.