Saltar al contenido
Volver al inicio 100 Días de Código en Python — Día 13: Depuración — Cómo Encontrar y Corregir Errores

100 Días de Código en Python — Día 13: Depuración — Cómo Encontrar y Corregir Errores

Nivel: Grado décimo Área: Tecnología e Informática Modalidad: Tutorial práctico Fuente: Curso "100 Days of Code: The Complete Python Pro Bootcamp" (Angela Yu, App Brewery). Contenido del Día 13.

Este tutorial adapta pedagógicamente el Día 13. El curso presenta 10 consejos de depuración; aquí se organizan en 7 temas. Las secciones 📝 Ejercicio original del curso provienen de los archivos del curso. El Día 13 no tiene proyecto final propio y sus retos de depuración finales no están incluidos entre los archivos suministrados. Por eso el proyecto del día, el proyecto extra, el integrador y los retos 🟢🟡🟠🔴 son creaciones de esta adaptación. Las correcciones al material original aparecen como 🛠️ Nota técnica.


Tabla de contenidos

  1. Antes de empezar: todos creamos bugs
  2. Consejo 1: Describe el problema
  3. Consejo 2: Reproduce el bug
  4. Consejo 3: Juega a ser el computador
  5. Consejo 4: Corrige los errores (y conoce try/except)
  6. Consejo 5: print() es tu mejor amigo
  7. Consejo 6: El depurador
  8. Consejos 7 a 10: descansa, pide ayuda, ejecuta a menudo, Stack Overflow
  9. 🚀 Proyecto del día: Clínica de Bugs
  10. 🌟 Proyecto extra: Auditoría de tus propios proyectos
  11. 🏆 Proyecto integrador del Día 13: Kit de Entradas a Prueba de Errores
  12. 🤖 Programar con apoyo de IA
  13. 🛠️ Correcciones técnicas al material original
  14. 📋 Matriz de trazabilidad
  15. 📦 Evidencias de aprendizaje del Día 13

0. Antes de empezar: todos creamos bugs

(Fuentes: 094 - Describe the Problem.md, parte inicial, y 101 - Building Confidence.md)

Depurar (debugging) es encontrar y eliminar errores (bugs) del código. El curso recuerda la historia de Grace Hopper, pionera de la programación: en un registro de trabajo de su equipo quedó pegada una polilla que se había encontrado en un relé del computador y que impedía que funcionara bien.

La idea central del día: no te deprimas por crear bugs. Todos los programadores los creamos. Lo que se entrena es la habilidad de encontrarlos y corregirlos. Como dice el curso, cada bug que resuelves es una repetición en el gimnasio.

Mensaje de cierre: la confianza se gana superando obstáculos. Cada problema difícil que resuelves hace que el siguiente parezca más fácil.

Prerequisito general: Días 1 a 12. Hoy repasarás muchos errores de tu cuaderno de errores.

Los 10 consejos del curso de un vistazo

# Consejo Tema
1 Describe el problema 1
2 Reproduce el bug 2
3 Juega a ser el computador 3
4 Corrige los errores (editor y consola) 4
5 Usa print() 5
6 Usa un depurador 6
7 Tómate un descanso 7
8 Pregúntale a un amigo 7
9 Ejecuta el código a menudo 7
10 Pregunta en Stack Overflow 7

1. Consejo 1: Describe el problema

(Fuente: 094 - Describe the Problem.md)

🎯 Objetivo de aprendizaje

  • Formular con precisión qué debería pasar y qué pasa realmente.
  • Identificar y poner a prueba las suposiciones.

📖 Explicación conceptual

"Si el problema es confuso en tu cabeza, es casi imposible depurarlo." Antes de tocar el código, responde:

  • ¿Qué debería hacer el programa?
  • ¿Qué hace realmente?
  • ¿Qué supongo que es cierto? ¿Lo es de verdad?

📝 Ejercicio original del curso: "Lo tienes" nunca aparece

Python
def my_function():
    for i in range(1, 20):
        if i == 20:
            print("Lo tienes")

my_function()

Descripción del problema (según el curso): el bucle recorre números desde el 1 y se espera que imprima "Lo tienes" cuando i llegue a 20, pero nunca lo hace. Suposición falsa: que i llega a 20. range(1, 20) va del 1 al 19, porque el límite superior no se incluye (Día 5). Comprobado: 20 in range(1, 20) es False. Corrección: range(1, 21).

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: describe en tres frases (qué debería pasar, qué pasa, cuál es la suposición) el problema de este código:
Python
  nombres = ["Ana", "Luis", "Sara"]
  for i in range(1, len(nombres)):
      print(nombres[i])
  • 🟡 Reto 2: escribe una "plantilla de reporte de bug" con los campos que usarías para describir cualquier problema.
  • 🟠 Reto 3: usa tu plantilla para describir un bug real que hayas tenido en un proyecto anterior.
  • 🔴 Reto 4: busca un reporte de error (issue) en un proyecto de código abierto en GitHub. ¿Qué información incluye? ¿Qué le falta según tu plantilla?

2. Consejo 2: Reproduce el bug

(Fuente: 095 - Reproduce the Bug.md)

🎯 Objetivo de aprendizaje

  • Convertir un error intermitente (a veces sí, a veces no) en uno reproducible (siempre).

📖 Explicación conceptual

Los bugs que aparecen solo a veces son los más difíciles: pruebas dos veces, todo sale bien… y en la tercera falla. El truco es encontrar exactamente cuándo falla y forzar esa situación.

📝 Ejercicio original del curso: el dado que a veces falla

Python
from random import randint
dice_images = ["❶", "❷", "❸", "❹", "❺", "❻"]
dice_num = randint(1, 6)
print(dice_images[dice_num])

Estrategia del curso:

  1. Revisar la documentación: randint(1, 6) incluye el 1 y el 6.
  2. Fijar el valor para probar: dice_num = 1, luego 2, 3… y 6.
  3. Con dice_num = 6 siempre aparece IndexError: list index out of range. ¡Bug reproducido!
  4. Causa: los índices van de 0 a 5. Corrección: randint(0, 5).

Recordatorio del Día 4: random.choice(dice_images) evita este problema por completo.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: este programa falla "de vez en cuando". Reprodúcelo fijando el valor aleatorio y corrígelo:
Python
  import random
  meses = ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"]
  print(meses[random.randint(1, 12)])
  • 🟡 Reto 2: investiga random.seed(n) y úsalo para que una secuencia aleatoria se repita siempre igual. ¿Cómo ayuda eso a reproducir un bug?
  • 🟠 Reto 3: un programa falla solo cuando el usuario escribe su nombre con tilde. ¿Cómo lo reproducirías y qué datos de prueba usarías?
  • 🔴 Reto 4: diseña una tabla de datos de prueba límite (vacío, 0, negativo, máximo, con espacios, con mayúsculas) para la Calculadora del Día 10. ¿Cuáles reproducen un error?

3. Consejo 3: Juega a ser el computador

(Fuente: 096 - Play Computer and Evaluate Each Line.md)

🎯 Objetivo de aprendizaje

  • Ejecutar el código "a mano", línea por línea, evaluando cada condición.

📝 Ejercicio original del curso: ¿Millennial o Generación Z?

Python
year = int(input("¿En qué año naciste? "))
if year > 1980 and year < 1994:
    print("Eres millennial.")
elif year > 1994:
    print("Eres de la Generación Z.")

Síntoma: con 1994 no imprime nada (verificado).

Jugando a ser el computador (como el curso):

Paso Evaluación Resultado
1994 > 1980 True —
1994 < 1994 False True and False → False: se salta el if
1994 > 1994 False Se salta el elif
— No hay else No se imprime nada

Corrección: que un extremo incluya el 1994, con <= o con >=, según la clasificación que se quiera usar.

🛠️ Nota: los rangos de años de cada "generación" varían según la fuente (el propio curso aclara que dependen del país). Por ejemplo, el Pew Research Center considera millennials a los nacidos entre 1981 y 1996. Para la programación lo importante es que no queden años sin cubrir.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: juega a ser el computador con año = 1980. ¿Qué pasa? ¿Hay otro "hueco"?
  • 🟡 Reto 2: reescribe el programa para que cubra todos los años, con un else final.
  • 🟠 Reto 3: haz la tabla de seguimiento "a mano" de la escala de desempeño del Día 3 para las notas 2.99, 3.0, 3.95, 4.0 y 4.6.
  • 🔴 Reto 4: juega a ser el computador con este código antes de ejecutarlo y predice la salida exacta. Luego verifica.
Python
  x = 5
  for i in range(3):
      if x % 2 == 0:
          x = x // 2
      else:
          x = x * 3 + 1
      print(i, x)

4. Consejo 4: Corrige los errores

(Fuente: 097 - Fixing Errors and Watching for Red Underlines.md)

🎯 Objetivo de aprendizaje

  • Atender los errores del editor (subrayados) y de la consola (al ejecutar).
  • Buscar un error en internet quitando las partes específicas de tu código.
  • Usar try/except para que el programa no se detenga ante entradas inválidas.
  • Reconocer los bugs sin mensaje de error.

📖 Explicación conceptual

Tres tipos de errores que muestra el curso:

Tipo Ejemplo del curso Cómo se detecta
Error del editor Un print sin sangría después de if → expected an indented block Subrayado rojo antes de ejecutar
Error en tiempo de ejecución int("Twelve") → ValueError: invalid literal for int() with base 10: 'Twelve' (verificado) Aparece en la consola solo con ciertas entradas
Error de lógica print("Puedes manejar a los {age} años") imprime literalmente {age} No hay ningún mensaje: el programa hace algo distinto a lo esperado

Buscar el error en internet (técnica del curso): copia solo la parte genérica del mensaje (ValueError: invalid literal for int() with base 10), sin los datos propios de tu programa ('Twelve'), y agrega "Python".

Primer contacto con try/except. El curso lo presenta aquí por primera vez:

Python
try:
    age = int(input("¿Cuántos años tienes? "))
except ValueError:
    print("Escribiste un número inválido. Intenta con un número como 15.")
    age = int(input("¿Cuántos años tienes? "))
  • try: "intenta esta línea potencialmente peligrosa".
  • except ValueError: "si ocurre este error, en lugar de detener el programa, haz esto otro".

🛠️ Nota técnica: en la solución del curso, la segunda pregunta está dentro del except, sin protección. Si el usuario vuelve a escribir un texto, el programa se detiene con ValueError. La solución robusta combina while y try/except, y se trabaja en el proyecto integrador:

Python
while True:
    try:
        age = int(input("¿Cuántos años tienes? "))
        break
    except ValueError:
        print("Escribe un número, por ejemplo 15.")

(break sale del bucle; investígalo en la documentación.)

Los bugs más frustrantes no generan errores: "nadie te ayuda en esto". Ahí cuenta la experiencia. El curso anima a ayudar a otros en foros para practicar resolviendo bugs ajenos.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: provoca a propósito un ValueError, un TypeError, un IndexError, un KeyError y un NameError. Escribe para cada uno la parte "buscable" del mensaje.
  • 🟡 Reto 2: protege con try/except la conversión de la oferta en la Subasta Secreta (Día 9).
  • 🟠 Reto 3: en la Calculadora (Día 10), atrapa ZeroDivisionError y KeyError con dos bloques except distintos, cada uno con su mensaje.
  • 🔴 Reto 4: escribe tres bugs de lógica, sin mensaje de error, en un programa corto y dáselo a un compañero para que los encuentre.

5. Consejo 5: print() es tu mejor amigo

(Fuente: 098 - Squash bugs with a print() Statement.md)

📖 Explicación conceptual

Cuando el resultado es incorrecto, imprime los valores intermedios para ver dónde se desvían de lo esperado.

📝 Ejercicio original del curso: palabras en un libro

Python
pages = 0
word_per_page = 0
pages = int(input("Número de páginas: "))
word_per_page == int(input("Número de palabras por página: "))
total_words = pages * word_per_page
print(total_words)

Síntoma: con 45 páginas y 250 palabras por página, el resultado es 0. Técnica del curso: agregar print(f"pages = {pages}") y print(f"word_per_page = {word_per_page}"). Resultado: pages = 45, pero word_per_page = 0. Causa: == compara en lugar de asignar. La comparación da False y la variable no cambia (verificado). Corrección: usar =. El resultado correcto es 11 250.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: encuentra con print por qué esta función siempre devuelve 1:
Python
  def contar_vocales(texto):
      contador = 0
      for letra in texto:
          if letra in "aeiou":
              contador = 1
      return contador
  • 🟡 Reto 2: agrega print dentro del while de tu juego Adivina el Número para mostrar turns en cada vuelta.
  • 🟠 Reto 3: crea una bandera DEBUG = True (una constante, Día 12) y haz que los print de depuración solo aparezcan si DEBUG es True. Así los desactivas cambiando una sola línea.
  • 🔴 Reto 4: investiga el módulo logging de Python. ¿Qué ventajas tiene frente a print en un programa grande?

6. Consejo 6: El depurador

(Fuente: 099 - Bringing out the BIG Gun- Using a Debugger.md)

🎯 Objetivo de aprendizaje

  • Usar puntos de interrupción (breakpoints) y los botones de avance paso a paso.
  • Observar las variables mientras el programa se ejecuta.

📖 Explicación conceptual

Ya usamos Python Tutor (se abre en otra pestaña) y el depurador de Thonny. El de PyCharm (y el de la mayoría de editores) funciona de forma parecida:

Herramienta Qué hace
Punto de interrupción (clic en el margen, junto al número de línea) Pausa el programa en esa línea
Debug (ícono del insecto) Ejecuta el programa en modo de depuración
Step Over Ejecuta la línea actual y se detiene en la siguiente
Step Into Si la línea llama a una función, entra en ella, aunque sea de una librería como random
Step Into My Code Entra solo en funciones escritas por ti e ignora las de las librerías
Step Out Termina la función actual y vuelve a quien la llamó
Panel de variables Muestra el valor de cada variable en ese momento
Silenciar puntos de interrupción Ejecuta sin pausar

El curso lo resume así: el depurador es "como poner un print en todas las variables" y poder detener el tiempo en cualquier momento.

Curiosidad que muestra el curso: con Step Into sobre randint se ve que por dentro usa otra función, randrange. El depurador permite leer cómo está hecho el código de otros.

📝 Ejercicio original del curso: mutate

Python
from random import randint
from maths import add          # módulo propio con add(n1, n2)

def mutate(a_list):
    b_list = []
    new_item = 0
    for item in a_list:
        new_item = item * 2
        new_item += randint(1, 3)
        new_item = add(new_item, item)
    b_list.append(new_item)
    print(b_list)

mutate([1, 2, 3, 5, 8, 13])

Síntoma: se espera una lista de 6 números, pero se imprime uno solo (verificado). Técnica del curso: poner un punto de interrupción, observar b_list en el panel de variables y notar que no cambia durante el bucle. Solo recibe un elemento al final. Causa: b_list.append(new_item) está fuera del for, por un problema de sangría. Corrección: darle sangría para meterlo dentro del bucle.

🛠️ Nota técnica: el módulo propio del curso se llama maths.py, con "s". No lo llames math.py: Python ya tiene un módulo math y el tuyo lo "taparía", lo mismo que pasaba con random.py en el Día 4. El archivo maths.py no está incluido entre los materiales suministrados: créalo con def add(n1, n2): return n1 + n2.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: usa el depurador para seguir tu Blackjack con la mano [11, 11, 10] y observa cómo cambia la lista dentro de calculate_score.
  • 🟡 Reto 2: pon un punto de interrupción dentro de check_answer (Día 12) y usa Step Out para volver a game().
  • 🟠 Reto 3: usa Step Into sobre random.choice y describe qué encuentras.
  • 🔴 Reto 4: investiga los puntos de interrupción condicionales (se detienen solo si se cumple una condición, por ejemplo i == 15). Úsalos en un bucle de 100 vueltas.

7. Consejos 7 a 10

(Fuente: 100 - Final Debugging Tips.md)

# Consejo Idea del curso
7 Tómate un descanso Mirar el código fijamente no revela la solución. Un té, una siesta o dormir: al volver, todo parece más obvio
8 Pregúntale a un amigo Una persona real (idealmente alguien que programe o esté en el curso). No comparte tus suposiciones, así que ve lo que tú no ves. No es vergonzoso; la próxima vez tú le ayudas
9 Ejecuta a menudo Prueba después de cada cambio pequeño. Si hay varios errores, resuélvelos uno por uno
10 Stack Overflow Primero busca: tu error probablemente ya lo tuvo alguien más. Pregunta solo cuando hayas agotado las demás vías y el problema parezca realmente único

Reflexión de la instructora: hubo un momento en que sintió que "no era programadora de código, sino programadora de bugs". A medida que avances, tus bugs serán más grandes y complejos… y eso también es señal de progreso.

📝 Ejercicio original del curso: retos de depuración

La lección anuncia "algunos desafíos de codificación que debes depurar" en la lección siguiente. Su contenido no está incluido entre los archivos suministrados. El proyecto del día (Sección 8) propone una actividad equivalente.


8. 🚀 Proyecto del día: Clínica de Bugs

Situación

Llegan 6 "pacientes" (programas enfermos) a la clínica. Tu trabajo es diagnosticarlos y curarlos, documentando qué consejo usaste en cada caso.

Los pacientes

Paciente 1: el promedio que miente (sugerencia: jugar a ser el computador)

Python
n1, n2, n3 = 3.0, 4.0, 5.0
promedio = n1 + n2 + n3 / 3
print(promedio)   # se espera 4.0

Paciente 2: el contador de vocales (sugerencia: print): la función contar_vocales del Reto 1 del Tema 5.

Paciente 3: la lista incompleta (sugerencia: describir el problema)

Python
compras = ["arroz", "leche", "huevos"]
for i in range(1, len(compras)):
    print(f"- {compras[i]}")

Paciente 4: el mes fantasma (sugerencia: reproducir): el programa de los meses del Reto 1 del Tema 2.

Paciente 5: el descuento que no descuenta (sugerencia: print)

Python
total = 60000
if total > 50000:
    total == total * 0.9
print(f"Total a pagar: {total}")

Paciente 6: la entrada frágil (sugerencia: corregir errores y usar try/except)

Python
edad = int(input("Edad: "))
print(f"El próximo año tendrás {edad + 1}")

Pruébalo con quince, 15.5 y un Enter vacío.

Bitácora de depuración (entregable)

Para cada paciente, completa:

Campo Contenido
Síntoma ¿Qué debería pasar y qué pasa?
Suposición falsa ¿Qué creía el programador que era cierto?
Técnica usada Consejos 1 a 10
Causa Explicación con tus palabras
Corrección Código corregido
Prueba Datos con los que verificaste la corrección

Criterios

  • Los 6 pacientes quedan curados y verificados.
  • Cada diagnóstico usa una técnica distinta, o justifica por qué se repite.

9. 🌟 Proyecto extra: Auditoría de tus propios proyectos

Situación

En los tutoriales anteriores se documentaron bugs verificados en las soluciones del curso. Tu misión es auditar tus propias versiones de esos proyectos.

Lista de verificación

Proyecto Caso a probar ¿Tu versión falla?
Ahorcado (Día 7) Repetir una letra incorrecta; entrada vacía
Cifrado César (Día 8) Descifrar un texto de varias letras
Subasta (Día 9) Todas las ofertas en 0; nombre repetido
Calculadora (Día 10) Dividir entre 0; operador %
Blackjack (Día 11) Mano [11, 11, 10]; jugador y crupier con 22
Adivina el Número (Día 12) Escribir "EASY"; un número fuera de rango

Requisitos

  1. Probar los 6 casos en tus propias versiones.
  2. Documentar en la bitácora de la Sección 8 los que fallen.
  3. Corregir al menos tres.
  4. Escribir una reflexión: ¿cuál fue el bug más difícil de encontrar? ¿Qué consejo te sirvió más?

10. 🏆 Proyecto integrador del Día 13: Kit de Entradas a Prueba de Errores

Proyecto integrador creado para esta adaptación. Integra funciones con return (Día 10), módulos (Días 4 y 7), while (Día 6), constantes (Día 12) y try/except (Día 13).

Situación problema

Casi todos los bugs de "entrada del usuario" de los últimos días (ValueError, opciones en mayúsculas, números fuera de rango) se repiten en cada proyecto. En lugar de corregirlos una y otra vez, crearás un módulo reutilizable.

Pregunta orientadora

¿Cómo escribir una sola vez un código robusto y reutilizarlo en todos tus proyectos?

Requerimientos

Un módulo entradas.py con estas funciones (todas con docstring y return):

Función Comportamiento
pedir_entero(mensaje, minimo, maximo) Repite la pregunta hasta recibir un entero dentro del rango; usa try/except ValueError
pedir_decimal(mensaje, minimo, maximo) Igual, pero con float
pedir_opcion(mensaje, opciones) Acepta solo una opción de la lista, sin importar mayúsculas (.lower()) ni espacios (.strip())
pedir_si_no(mensaje) Devuelve True o False; acepta "s", "si", "sí", "n" y "no"

Después:

  1. Refactoriza Adivina el Número (Día 12) para usar pedir_opcion y pedir_entero.
  2. Refactoriza la Calculadora (Día 10) para usar pedir_decimal y pedir_opcion.
  3. Escribe un archivo pruebas_entradas.py que documente, en comentarios, los casos probados para cada función: vacío, texto, decimal, fuera de rango, mayúsculas y espacios.

Entregables

  • entradas.py, dos proyectos refactorizados y la tabla de pruebas.
  • Una bitácora con al menos un bug que hayas encontrado mientras construías el kit.

Criterios técnicos

  • Ninguna entrada, por extraña que sea, detiene los programas refactorizados.
  • Las funciones del kit no usan print salvo para los mensajes de error al usuario, y siempre devuelven el valor válido.
  • Los proyectos refactorizados son más cortos que los originales.

11. 🤖 Programar con apoyo de IA

Hoy la IA puede ser un buen "amigo" del consejo 8: no comparte tus suposiciones. Pero, igual que un compañero, puede equivocarse.

Actividad: la IA como compañera de depuración.

  1. Dale a una IA el Paciente 5 (el descuento) sin decirle cuál es el error. Pregúntale: "¿Por qué este código no aplica el descuento?".
  2. Evalúa: ¿encontró la causa (== en lugar de =)? ¿La explicó con claridad?
  3. Ahora dale el código de mutate corregido y pregúntale si tiene algún bug. ¿Inventa problemas que no existen? (Las IA a veces "encuentran" errores inexistentes para dar una respuesta.)
  4. Conclusión: ¿en qué se parece y en qué se diferencia pedirle ayuda a una IA y a un compañero?

12. 🛠️ Correcciones técnicas al material original

Archivo Afirmación en la transcripción Observación Tratamiento
094 El primer bug "fue encontrado por Grace Hopper" La polilla (1947, computador Harvard Mark II) quedó registrada en el cuaderno de trabajo de su equipo. La nota decía "primer caso real de un bug encontrado", porque la palabra bug ya se usaba antes para hablar de fallas Sección 0
096 Millennials de 1980 a 1994, Generación Z después Los rangos varían según la fuente (por ejemplo, Pew: 1981–1996) Nota en el Tema 3
097 try/except con la segunda pregunta dentro del except Si la segunda entrada también es inválida, el programa se detiene. Solución: while + try Nota técnica en el Tema 4 y proyecto integrador
099 Módulo propio de matemáticas No debe llamarse math.py porque taparía el módulo estándar. El del curso es maths.py (no suministrado) Nota técnica en el Tema 6
100 Retos de depuración en la lección siguiente No están incluidos entre los archivos suministrados Proyecto del día como alternativa

13. 📋 Matriz de trazabilidad

Contenido original Archivo de origen Concepto desarrollado Ejercicio original Reto adicional Proyecto relacionado
Grace Hopper, describir el problema, suposiciones 094 Sección 0 y Tema 1 "Lo tienes" con range(1, 20) Retos 1–4 del Tema 1 (plantilla de reporte de bug) Sección 8 (paciente 3)
Reproducir un bug intermitente 095 Tema 2 El dado con randint(1, 6) Retos 1–4 del Tema 2 (seed, datos límite) Sección 8 (paciente 4)
Jugar a ser el computador 096 Tema 3 Millennial / Generación Z con 1994 Retos 1–4 del Tema 3 Sección 8 (paciente 1)
Errores del editor y la consola, buscar en internet, try/except, bugs sin error 097 Tema 4 Sangría, int("Twelve"), f-string sin f Retos 1–4 del Tema 4 Secciones 8 (paciente 6) y 10
print como herramienta 098 Tema 5 Palabras en un libro (==) Retos 1–4 del Tema 5 (bandera DEBUG) Sección 8 (pacientes 2 y 5)
Depurador: puntos de interrupción y botones de avance 099 Tema 6 mutate Retos 1–4 del Tema 6 Sección 9
Descanso, amigo, ejecutar a menudo, Stack Overflow 100 Tema 7 Retos de depuración (mencionados, no suministrados) — Secciones 8 y 9
La confianza se gana 101 Sección 0 — — —
(No existe en el curso original) — — — Clínica de Bugs Sección 8
(No existe en el curso original) — — — Auditoría de tus proyectos Sección 9
(No existe en el curso original) — — — Kit de Entradas a Prueba de Errores Sección 10

14. 📦 Evidencias de aprendizaje del Día 13

  • Bitácora de depuración de la Clínica de Bugs (6 pacientes).
  • Captura del depurador de PyCharm o de Thonny con un punto de interrupción y el panel de variables visible.
  • Uno de los proyectos adicionales: la Auditoría o el Kit de Entradas.
  • Cuaderno de errores completo y organizado, con todos los errores vistos desde el Día 1: nombre, causa típica, cómo encontrarlo y cómo corregirlo.
  • Reflexión: ¿cuál de los 10 consejos te resulta más útil? ¿Cuál vas a empezar a usar desde hoy?