Saltar al contenido
Volver al inicio 100 Días de Código en Python — Día 6: Funciones, Sangría y Bucles while (con el robot Reeborg)

100 Días de Código en Python — Día 6: Funciones, Sangría y Bucles while (con el robot Reeborg)

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 6.

Este tutorial adapta el contenido original del Día 6 para trabajarlo en clase. Las secciones 📝 Ejercicio original del curso provienen de los archivos del curso. Los retos 🟢🟡🟠🔴, el proyecto extra y el proyecto integrador son creaciones de esta adaptación. Las correcciones al material original aparecen como 🛠️ Nota técnica.

Herramienta del día: el Mundo de Reeborg (se abre en otra pestaña) es un simulador que funciona en el navegador, sin instalar nada. Allí se escribe código Python para controlar un robot y se ve el resultado de inmediato. Es muy parecido a Karel el Robot, una herramienta clásica para aprender a programar.


Tabla de contenidos

  1. Antes de empezar
  2. Definir y llamar funciones
  3. Funciones + bucles: la carrera de obstáculos 1
  4. Sangría y bloques de código
  5. Bucles while
  6. while + condiciones del robot: obstáculos 2, 3 y 4
  7. 🚀 Proyecto del día: Escapar del Laberinto
  8. 🌟 Proyecto extra: La Alcancía Digital
  9. 🏆 Proyecto integrador del Día 6: Caja Registradora de la Tienda Escolar
  10. 🤖 Programar con apoyo de IA
  11. 🛠️ Correcciones técnicas al material original
  12. 📋 Matriz de trazabilidad
  13. 📦 Evidencias de aprendizaje del Día 6

0. Antes de empezar

(Fuente: 043 - Day 6 Goals- what we will make by the end of the day.md, 051 - Why is this -so- Hard-! Can I really do this-.md)

Hoy aprenderemos a crear nuestras propias funciones, a entender la sangría como estructura del código y a usar un nuevo tipo de bucle, el while. Al final, programaremos un robot capaz de salir de un laberinto empezando desde cualquier posición.

El mensaje de cierre del curso: aprender algo nuevo duele, igual que caerse al agua una y otra vez al aprender windsurf. La dificultad no significa que vayas mal: significa que estás aprendiendo.

Prerequisito general: bucles for y range() (Día 5), condicionales y not (Día 3).


1. Definir y llamar funciones

(Fuente: 044 - Defining and Calling Python Functions.md)

Prerequisito: uso de funciones incorporadas como print(), len() e int().

🎯 Objetivo de aprendizaje

  • Definir funciones propias con def.
  • Distinguir entre definir una función (escribir la receta) y llamarla (cocinar con ella).
  • Usar funciones para evitar código repetido y hacerlo más legible.

🧠 ¿Qué aprenderemos?

  • Funciones incorporadas frente a funciones propias.
  • Sintaxis def nombre():.
  • Llamar una función y cómo "salta" la ejecución hacia ella.

📖 Explicación conceptual

Ya usamos muchas funciones: print(), len(), int(), range()… Las reconocemos porque son un nombre seguido de paréntesis. Ahora crearemos las nuestras.

Paso 1: definir (escribir la receta)

Python
def mi_funcion():
    print("Hola")
    print("Adiós")
  • def viene de define (definir).
  • Después va el nombre, los paréntesis () y los dos puntos :.
  • Las líneas con sangría forman el cuerpo de la función.

Si ejecutas solo esto, no pasa nada: la receta está escrita, pero nadie la ha cocinado.

Paso 2: llamar (usar la receta)

Python
mi_funcion()

Cuando Python llega a esa línea, "salta" a la definición, ejecuta sus líneas en orden y luego regresa para seguir justo después de la llamada.

¿Por qué usar funciones? El curso lo explica con un robot que va a comprar leche. Si hay que darle 15 instrucciones cada día (salir, caminar dos cuadras, girar…), repetirlas todas es tedioso. Una función comprar_leche() agrupa esas instrucciones bajo un solo nombre.

🔎 Ejemplo explicado: girar a la derecha en Reeborg

El robot de Reeborg solo sabe move() (avanzar una casilla) y turn_left() (girar a la izquierda). No sabe girar a la derecha, pero se lo podemos enseñar:

Python
def turn_right():
    turn_left()
    turn_left()
    turn_left()

def turn_around():
    turn_left()
    turn_left()

move()
turn_right()
move()
  • Por qué funciona: tres giros de 90° a la izquierda equivalen a uno a la derecha.
  • Ventajas que destaca el curso: menos líneas de código y, sobre todo, más legibilidad. turn_right() dice lo que hace; tres turn_left() seguidos obligan a pensar.
  • Consejo: en Reeborg, el botón paso a paso (⏯) resalta cada línea mientras se ejecuta. Úsalo para ver cómo la ejecución "salta" dentro de la función y regresa.

⚠️ Errores frecuentes

1. Llamar la función antes de definirla

  • Qué ocurre: NameError: name 'saludar' is not defined.
  • Por qué ocurre: Python lee de arriba hacia abajo; cuando llega a la llamada, la función todavía no existe.
  • Cómo solucionarlo: escribe las definiciones al inicio del archivo.

2. Olvidar los paréntesis al llamar

  • Qué ocurre: turn_right sin () no ejecuta nada y no muestra ningún error.
  • Cómo solucionarlo: siempre turn_right().

3. Sangría inconsistente dentro de la función → IndentationError, o que una línea quede por fuera de la función sin que te des cuenta.

📝 Ejercicio original del curso: turn_right() y el cuadrado

Enunciado:

  1. Crea la función turn_right().
  2. Úsala para que el robot dibuje un pequeño cuadrado partiendo de (1, 1) y vuelva al inicio. Conceptos: definir y llamar funciones.

🔍 Antes de programar

  • ¿Hacia dónde mira el robot al inicio?
  • Recorre el cuadrado con el dedo: ¿qué giros necesitas y en qué orden?
  • Predice antes de ejecutar: si el robot hace move() tres veces, luego turn_left() y otra vez move() tres veces, ¿dónde termina? (Respuesta del curso: en (4, 4).)

Retos adicionales (creados para esta adaptación)

🟢 Reto 1: Aplicación

En Python normal, crea una función mostrar_encabezado() que imprima el nombre de tu colegio entre dos líneas de =. Llámala dos veces.

🟡 Reto 2: Ampliación

En Reeborg, crea turn_around() y úsala para que el robot vaya a la casilla 3, dé la vuelta, regrese a la 1, dé la vuelta y termine en la 3.

🟠 Reto 3: Desafío

En Reeborg, dibuja un rectángulo de 3 × 2 casillas y define una función lado_largo() y otra lado_corto().

🔴 Reto 4: Pensamiento computacional

Escribe en español, como una "función" de pasos precisos, las instrucciones para que un robot prepare una aguapanela. Identifica qué pasos se repiten y agrúpalos en funciones (por ejemplo servir_taza()). ¿Qué instrucciones darías por obvias que un robot no entendería?

🧩 Comprueba lo aprendido: Tema 1

  • Conceptual: ¿qué diferencia hay entre definir y llamar una función?
  • Predicción: ¿qué imprime este código y en qué orden?
Python
  def a():
      print("A")
  print("inicio")
  a()
  a()
  print("fin")
  • Depuración: este código produce NameError. Corrígelo:
Python
  bienvenida()
  def bienvenida():
      print("Bienvenido")

Evidencia: captura de Reeborg con el cuadrado dibujado y el código.


2. Funciones + bucles: la carrera de obstáculos 1

(Fuente: 045 - The Hurdles Loop Challenge.md)

Prerequisito: Tema 1, for con range() (Día 5).

🎯 Objetivo de aprendizaje

  • Descomponer un problema repetitivo en una función.
  • Combinar funciones con for para reducir el código al mínimo sin perder legibilidad.

📖 Explicación conceptual: tres versiones de la misma solución

En el mundo Hurdle 1 de Reeborg, el robot debe saltar 6 vallas para llegar a la meta. El curso muestra cómo mejora el código paso a paso:

Versión Técnica Líneas aproximadas
1 Escribir cada instrucción una tras otra ≈ 58
2 Agrupar un salto en una función jump() y llamarla 6 veces ≈ 21
3 Llamar jump() dentro de un for con range(6) aún menos

Estrategia de trabajo que enseña el curso: programar un solo salto, probarlo línea por línea y solo entonces pensar en repetirlo. Así, si algo falla, sabes exactamente dónde.

💡 El curso bromea con que "los programadores nacimos para ser perezosos". La idea de fondo es que si repites código, hay una forma mejor de escribirlo.

Atajo de editor: para aplicar sangría a varias líneas a la vez, selecciónalas y usa Ctrl + ] (Windows) o Cmd + ] (Mac). Para quitarla, Ctrl + [ o Cmd + [. (En Reeborg, y en la mayoría de editores, también funciona la tecla Tab con las líneas seleccionadas.)

📝 Ejercicio original del curso: Hurdle 1

Enunciado: en el mundo Hurdle 1, haz que el robot salte las 6 vallas y llegue a la meta con la menor cantidad de líneas posible, sin sacrificar la legibilidad.

🔍 Antes de programar

  • ¿Qué secuencia exacta de movimientos es un salto? Escríbela en papel.
  • Cuando termina un salto, ¿el robot queda en una situación equivalente a la del inicio? (El curso observa que (3, 1) "es casi lo mismo" que (1, 1).)
  • ¿Cuántas veces se repite esa secuencia?

Pista de estructura: un salto (según el curso) es: avanzar → girar a la izquierda → avanzar → girar a la derecha → avanzar → girar a la derecha → avanzar → girar a la izquierda.

Retos adicionales (creados para esta adaptación)

🟢 Reto 1: Aplicación

Resuelve Hurdle 1 con for y range(). Luego con for y una lista: for valla in [1, 2, 3, 4, 5, 6]:. ¿Hay alguna diferencia?

🟡 Reto 2: Ampliación

En Python normal, crea imprimir_linea() y úsala en un for para dibujar un marco.

🟠 Reto 3: Desafío

Cuenta las líneas de tus tres versiones de Hurdle 1 y escribe un párrafo comparando la brevedad con la legibilidad. ¿Siempre es mejor tener menos líneas?

🔴 Reto 4: Pensamiento computacional

Si el robot tuviera que saltar 6 vallas pero cada tercera valla fuera doble (el doble de alta), ¿cómo lo resolverías con for, % (Día 3) y dos funciones? Escribe el algoritmo en pseudocódigo.


3. Sangría y bloques de código

(Fuente: 046 - Indentation in Python.md)

Prerequisito: bloques en if (Día 3), for (Día 5) y funciones (Tema 1).

🎯 Objetivo de aprendizaje

  • "Ver" los bloques de código a partir de la sangría.
  • Seguir la recomendación oficial de sangría (PEP 8): 4 espacios.

📖 Explicación conceptual

Los bloques son como carpetas. El curso compara la sangría con las carpetas del explorador de archivos: todo lo que está "dentro" de la carpeta mi_funcion tiene sangría respecto a ella. Si un if está dentro de la función, sus líneas son una subcarpeta: dos niveles de sangría (8 espacios).

Python
def mi_funcion():            # nivel 0
    if cielo == "despejado":     # nivel 1 → dentro de la función
        print("azul")            # nivel 2 → dentro del if
    elif cielo == "lluvioso":
        print("gris")
    print("fin de la función")   # nivel 1 → dentro de la función, fuera del if
print("Hola")                # nivel 0 → fuera de todo

¿Espacios o tabulaciones? Es una discusión eterna entre programadores. El curso incluso muestra una escena de la serie Silicon Valley sobre el tema. La guía oficial de estilo, PEP 8 (se abre en otra pestaña), es clara:

  • Usa espacios, 4 por cada nivel.
  • No mezcles tabulaciones y espacios. En Python 3, mezclarlos de forma inconsistente produce un error.
  • La mayoría de editores se pueden configurar para que la tecla Tab inserte 4 espacios automáticamente.

💡 Pensamiento crítico: el curso menciona una encuesta de Stack Overflow (2017) en la que quienes usaban espacios reportaban salarios más altos. Eso es una correlación, no una causa: usar espacios no sube el sueldo. ¿Qué otros factores podrían explicar ese resultado?

⚠️ Errores frecuentes

Error Causa típica
IndentationError: expected an indented block El bloque después de : quedó sin sangría
IndentationError: unexpected indent Hay sangría donde no se abrió ningún bloque
TabError: inconsistent use of tabs and spaces in indentation Mezcla de tabulaciones y espacios
Sin error, pero con un resultado incorrecto Una línea quedó en el nivel equivocado (dentro o fuera de un bloque)

📝 Ejercicio original del curso: cuestionario de sangría

La lección remite a un cuestionario sobre sangría. Su contenido no está incluido entre los archivos suministrados.

🧩 Comprueba lo aprendido: Tema 3 (actividad equivalente, creada para esta adaptación)

  • Análisis: marca con colores los bloques del ejemplo anterior (función, if, elif).
  • Predicción: si cielo = "nublado" y se llama la función, ¿qué se imprime?
  • Modificación: mueve print("fin de la función") un nivel hacia adentro. ¿Cuándo se imprime ahora?
  • Configuración: revisa en tu editor (PyCharm, VS Code o Thonny) cómo hacer que Tab inserte 4 espacios.

4. Bucles while

(Fuente: 047 - While Loops.md)

Prerequisito: for (Día 5), condiciones y not (Día 3).

🎯 Objetivo de aprendizaje

  • Escribir bucles while que se repiten mientras una condición sea verdadera.
  • Elegir entre for y while según el problema.
  • Reconocer y evitar los bucles infinitos.

📖 Explicación conceptual

Un while repite su bloque mientras la condición sea True. Antes de cada vuelta vuelve a revisar la condición:

Python
while condicion:
    # hacer algo
    # (algo aquí dentro debe hacer que, tarde o temprano, la condición sea False)

Ejemplo del curso: un robot de juguete que avanza mientras está conectado a la corriente.

Hurdle 1 con while:

Python
numero_de_vallas = 6
while numero_de_vallas > 0:
    jump()
    numero_de_vallas -= 1
    print(numero_de_vallas)
Vuelta numero_de_vallas antes ¿> 0? Después de -= 1
1 6 ✅ 5
… … … …
6 1 ✅ 0
— 0 ❌ → sale del bucle —

¿for o while? (criterio del curso)

Usa for cuando… Usa while cuando…
Recorres cada elemento de una lista o un rango No sabes cuántas repeticiones harán falta
Sabes de antemano cuántas vueltas habrá Repites hasta que ocurra algo (llegar a la meta, que el usuario escriba "salir")

Bucles infinitos. Si la condición nunca se vuelve False (por ejemplo while 5 > 3:), el programa no termina nunca. Todos los programadores crean alguna vez un bucle infinito. Detén el programa (en PyCharm con el botón Stop; en la terminal con Ctrl + C) y revisa la condición. Consejo del curso: imprime la condición dentro del bucle para ver por qué nunca cambia.

🔎 Ejemplo explicado (Python normal, ampliación de esta adaptación)

Python
clave_correcta = "python123"
intento = input("Escribe la clave: ")
while intento != clave_correcta:
    print("Clave incorrecta")
    intento = input("Escribe la clave: ")
print("¡Acceso concedido!")
  • Por qué while: no sabemos cuántos intentos necesitará el usuario.
  • Qué evita el bucle infinito: en cada vuelta se pide un nuevo intento. Si esa línea faltara, el programa repetiría "Clave incorrecta" para siempre.

⚠️ Errores frecuentes

  • Olvidar actualizar la variable de la condición (numero_de_vallas -= 1) → bucle infinito.
  • Usar if pensando que repite: un if se evalúa una sola vez; el while se repite.
  • Condición invertida: while intento == clave_correcta nunca entra al bucle si la primera clave es incorrecta, o nunca sale si es correcta.

Retos adicionales (creados para esta adaptación)

🟢 Reto 1: Aplicación

Con while, imprime un conteo regresivo del 10 al 1. Compáralo con la versión con for del Día 5.

🟡 Reto 2: Ampliación

Pide números al usuario y súmalos hasta que escriba 0. Muestra el total.

🟠 Reto 3: Desafío

¿Cuántas veces hay que duplicar $1 000 para superar $1 000 000? Resuélvelo con while y un contador.

🔴 Reto 4: Pensamiento computacional

Tienes un bucle infinito en este código. Explica por qué ocurre sin ejecutarlo y corrígelo de dos formas distintas:

Python
n = 1
while n != 10:
    n += 2

5. while + condiciones del robot: obstáculos 2, 3 y 4

(Fuentes: 047 - While Loops.md (Hurdle 2), 048 - Hurdles Challenge using While Loops.md, 049 - Jumping over Hurdles with Variable Heights.md)

Prerequisito: Tema 4.

📖 Condiciones de Reeborg

En la pestaña Conditions del teclado de Reeborg hay funciones que devuelven True o False:

Condición Pregunta
at_goal() ¿Estoy en la meta?
front_is_clear() ¿El frente está libre?
wall_in_front() ¿Hay una pared al frente?
right_is_clear() ¿La derecha está libre?
wall_on_right() ¿Hay una pared a la derecha?

Todas pueden negarse con not: not at_goal().

🛠️ Nota técnica: en la transcripción las condiciones se dictan sin paréntesis ("while not at_goal"). En el código deben llevar paréntesis: while not at_goal():. Sin paréntesis, at_goal es la función en sí y no su resultado. Python la considera "verdadera", así que not at_goal siempre es False y el bucle nunca se ejecuta.

📝 Ejercicio original del curso: Hurdle 2 (meta en posición aleatoria)

Enunciado: la bandera aparece en una posición aleatoria. El robot debe saltar vallas hasta llegar a ella. Conceptos: while, not, at_goal(). Idea del curso: "mientras no esté en la meta, salta". El curso prefiere while not at_goal(): a compararlo con != True, porque se lee casi como una frase en inglés.

📝 Ejercicio original del curso: Hurdle 3 (paredes en posiciones aleatorias)

Enunciado: ahora las paredes aparecen en posiciones y cantidades aleatorias. El robot debe seguir la línea punteada (no vale "rodearlo todo por arriba").

🔍 Antes de programar

  • ¿Qué debe hacer el robot si hay una pared al frente? ¿Y si no la hay?
  • Trampa que señala el curso: la función jump() de Hurdle 1 empieza con move(). Si hay una pared justo al frente, ¡el robot choca! ¿Cómo debes modificar jump()?

📝 Ejercicio original del curso: Hurdle 4 (vallas de altura variable)

Enunciado: posición, cantidad y altura de las vallas son aleatorias. El robot debe subir lo necesario, cruzar y bajar hasta el suelo. Meta del curso: entre 20 y 24 líneas de código.

🔍 Antes de programar

  • Al subir junto a una valla, ¿qué condición te dice que todavía estás junto a la pared? (wall_on_right())
  • Al bajar, ¿qué condición te dice que todavía no has llegado al suelo? (front_is_clear())
  • ¿Cuántos while necesita la nueva función jump()? ¿Pueden estar dentro de una función que a su vez se llama dentro de otro while?

Estructura de la solución del curso (sin código completo): jump() gira a la izquierda → mientras haya pared a la derecha, avanza → gira a la derecha, avanza, gira a la derecha → mientras el frente esté libre, avanza → gira a la izquierda.

Lección de depuración del curso: al ejecutar su solución apareció un SyntaxError porque faltaban unos dos puntos. Prueba tu código después de cada cambio pequeño, así el error es fácil de ubicar.

Retos adicionales (creados para esta adaptación)

🟢 Reto 1

Resuelve Hurdle 2 con un contador y con at_goal(). ¿Cuál funciona sin importar dónde esté la meta?

🟡 Reto 2

Haz que Hurdle 3 funcione aunque el robot empiece mirando hacia otro lado. (Pista: un while inicial.)

🟠 Reto 3

Cuenta cuántas vallas saltó el robot en Hurdle 3 o 4 y muéstralo al final con print().

🔴 Reto 4

Diseña en papel un mundo de obstáculos que haga fallar tu solución de Hurdle 4. ¿Qué supuesto de tu algoritmo se rompe?


6. 🚀 Proyecto del día: Escapar del Laberinto

(Fuente: 050 - Final Project- Escaping the Maze.md, proyecto oficial del curso original)

Problema

En el mundo Maze de Reeborg, el robot aparece en una posición y dirección aleatorias. Debe llegar a la meta sin importar dónde empiece.

Contexto: el algoritmo de la mano derecha

La información del mundo (World Info) da la clave: si en un laberinto sigues siempre la pared de tu derecha, terminas encontrando la salida. No es un camino directo, es una estrategia, es decir, un algoritmo. Tiene una jerarquía de decisiones:

  1. Si puedes girar a la derecha, gira y avanza.
  2. Si no, y el frente está libre, avanza.
  3. Si no puedes ni lo uno ni lo otro, gira a la izquierda.

Requisitos funcionales

  • El robot llega a la meta desde cualquier posición inicial.
  • El código usa while, if/elif/else, turn_right() y las condiciones de Reeborg.

🔍 Antes de programar

  • ¿Qué estructura corresponde a la jerarquía "derecha → frente → izquierda"? (Día 3: if/elif/else.)
  • ¿Qué condición de while hace que el robot siga hasta la meta?
  • Predice: si solo escribes el if de la derecha, sin elif ni else, ¿qué pasa cuando la derecha está bloqueada? (El curso lo prueba: el robot se queda atascado en un bucle infinito.)

Construcción paso a paso

Versión 1: turn_right() + while not at_goal(): con solo el caso de la derecha. Pruébalo y observa el fallo. Versión 2: agrega elif para el frente. Versión 3: agrega else para girar a la izquierda. Pruébalo muchas veces con posiciones aleatorias.

🧪 Prueba y depuración: el caso extremo (nivel avanzado)

El curso muestra un caso extremo. Si el robot empieza en ciertas posiciones sin pared a su derecha (por ejemplo, en un espacio abierto de 2 × 2), la regla "si la derecha está libre, gira y avanza" lo hace dar vueltas en círculo para siempre. Una pista: el contador de pasos de Reeborg supera los 1000.

  • Diagnóstico del curso: el algoritmo de la mano derecha supone que el robot ya tiene una pared a su derecha.
  • Idea de solución del curso: antes del bucle principal, avanzar mientras el frente esté libre hasta encontrar una pared, y luego girar a la izquierda para que esa pared quede a la derecha.
  • El curso ofrece tres "mundos problema" descargables para verificar la solución. Esos archivos no están incluidos entre los materiales suministrados.

El curso recomienda a los principiantes marcar este reto y volver a él después del Día 15. No te frustres si hoy no sale: es depuración de nivel intermedio.

Pruebas

  • Ejecuta el laberinto al menos 10 veces, porque la posición inicial cambia en cada ejecución.
  • Registra en una tabla: el número de pasos y si el robot llegó o no.
  • Si alguna vez supera los 1000 pasos, anota la posición y la dirección iniciales: ese es tu caso de prueba problemático.

⭐ Extensión del proyecto

  • Implementa el algoritmo de la mano izquierda. ¿Funciona igual?
  • Explica con un dibujo por qué el algoritmo de la mano derecha no funcionaría en un laberinto con "islas" (paredes que no están conectadas con el borde).

7. 🌟 Proyecto extra: La Alcancía Digital

Situación

Un estudiante quiere ahorrar para la excursión de fin de año. Deposita dinero semana a semana y quiere saber cuántas semanas tarda en alcanzar la meta.

Requisitos

  1. Una función mostrar_bienvenida() que imprima el título del programa.
  2. Pedir la meta de ahorro.
  3. Mientras el ahorro sea menor que la meta: pedir el depósito de la semana, acumularlo, contar la semana y mostrar cuánto falta.
  4. Rechazar los depósitos negativos o iguales a cero con un mensaje. Decide: ¿esa semana se cuenta o no?
  5. Al terminar, mostrar el total ahorrado, las semanas y el excedente, si lo hay.

Casos de prueba

Meta Depósitos Semanas Excedente
100 000 30 000, 30 000, 50 000 3 10 000
50 000 -5 000, 50 000 1 (si el depósito inválido no cuenta) 0

⭐ Extensión

Agrega la opción de escribir "retiro" para sacar dinero de la alcancía.


8. 🏆 Proyecto integrador del Día 6: Caja Registradora de la Tienda Escolar

Proyecto integrador creado para esta adaptación. Integra listas (Día 4), for (Día 5), while, funciones sin parámetros, condicionales y f-strings.

Situación problema

La tienda escolar anota los pedidos a mano y los cálculos en el descanso generan filas largas. Vas a programar una caja registradora de consola.

Pregunta orientadora

¿Cómo organizar un programa que se repite hasta que el usuario decida terminar, de forma que sea fácil de leer y de ampliar?

Requerimientos

  1. Dos listas paralelas: productos y precios, con al menos 5 productos.
  2. Una función mostrar_menu() que recorra las listas con for e imprima cada producto con su número y su precio.
  3. Un bucle while que pida el número del producto hasta que el cajero escriba fin.
  4. Validar que el número del producto exista. Si no, mostrar un mensaje sin bloquear el programa.
  5. Acumular el total y guardar en una lista los productos vendidos.
  6. Al terminar, mostrar un recibo: cada producto vendido, el total y el valor del descuento si el total supera los $10 000 (5 %).
  7. Una función mostrar_despedida().

Etapas

  1. Listas y mostrar_menu().
  2. Bucle de venta con la opción fin.
  3. Validación de la entrada.
  4. Recibo y descuento.

Casos de prueba

Entradas del cajero Resultado esperado
1, 1, fin Dos veces el producto 1 y su total
9 (si solo hay 5 productos) "Producto no existe" y el programa continúa
fin al inicio Recibo vacío con total $0

Criterios técnicos

  • Sin bucles infinitos ni IndexError.
  • El código está organizado con funciones y la sangría es correcta y consistente (4 espacios).

9. 🤖 Programar con apoyo de IA

Reeborg es un excelente banco de pruebas para evaluar respuestas de IA, porque los resultados se ven: el robot llega a la meta o no llega.

Actividad: pide a una IA una solución para el laberinto de Reeborg. Luego:

  1. Ejecútala al menos 10 veces, porque la posición inicial es aleatoria.
  2. Verifica si contempla el caso extremo del espacio abierto (más de 1000 pasos).
  3. Verifica si escribió las condiciones con paréntesis: at_goal().
  4. Compara su algoritmo con el de la mano derecha: ¿es el mismo? ¿Por qué funciona o por qué falla?

10. 🛠️ Correcciones técnicas al material original

Archivo Afirmación en la transcripción Observación Tratamiento
047, 048, 050 "while not at_goal" (dictado sin paréntesis) Las condiciones de Reeborg son funciones: at_goal(). Sin (), not at_goal siempre es False Nota técnica en el Tema 5
044 Se nombra la función "turn-around()" Un guion no es válido en un nombre de función; debe ser turn_around() Se usa guion bajo
046 "En Python 3 no puedes mezclar tabuladores y espacios en el mismo archivo" Más preciso: la mezcla inconsistente en la sangría produce TabError. PEP 8 recomienda usar solo espacios Tabla de errores del Tema 3
046 Encuesta de salarios: espacios frente a tabulaciones Es una correlación, no una causa Nota de pensamiento crítico en el Tema 3
050 Mundos problema descargables No están incluidos entre los archivos suministrados Se indica en el proyecto

11. 📋 Matriz de trazabilidad

Contenido original Archivo de origen Concepto desarrollado Ejercicio original Reto adicional Proyecto relacionado
Objetivos: robot y laberinto 043 Sección 0 — — Sección 6
def, llamar funciones, Reeborg, turn_right, turn_around 044 Tema 1 turn_right() y el cuadrado Retos 1–4 del Tema 1 Proyectos 6, 7 y 8
Hurdle 1: función + for 045 Tema 2 Hurdle 1 Retos 1–4 del Tema 2 Proyecto 6
Sangría, espacios frente a tabulaciones, PEP 8 046 Tema 3 Cuestionario (mencionado, no suministrado) Actividad equivalente del Tema 3 Todos
while, for frente a while, bucle infinito, Hurdle 2 047 Temas 4 y 5 Hurdle 2 Retos 1–4 del Tema 4 Proyectos 7 y 8
Hurdle 3 048 Tema 5 Hurdle 3 Retos 2–3 del Tema 5 Proyecto 6
Hurdle 4 049 Tema 5 Hurdle 4 Reto 4 del Tema 5 Proyecto 6
Laberinto, mano derecha, caso extremo 050 Integración Proyecto oficial (con depuración avanzada) Extensiones: mano izquierda, islas Sección 6
Motivación: la dificultad es aprendizaje 051 Sección 0 — — —
(No existe en el curso original) — — — Alcancía Digital Sección 7
(No existe en el curso original) — — — Caja Registradora Sección 8

12. 📦 Evidencias de aprendizaje del Día 6

  • Capturas de Reeborg: cuadrado, Hurdle 1 a 4 y Laberinto, cada una con su código.
  • Tabla de 10 ejecuciones del laberinto (pasos y resultado).
  • Comparación escrita de las 3 versiones de Hurdle 1 (brevedad frente a legibilidad).
  • Uno de los proyectos adicionales funcionando.
  • Cuaderno de errores: NameError por llamar una función antes de definirla, TabError, bucle infinito (cómo detectarlo y detenerlo) y condición sin paréntesis.