Este tutorial adapta pedagógicamente el contenido original del Día 3. 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.
Tabla de contenidos
- Antes de empezar: programas que toman decisiones
- Condicionales
if/elsey operadores de comparación - El operador módulo
% - Condicionales anidados y
elif - Varios
ifseguidos - Operadores lógicos
and,or,not - Herramientas de texto para el proyecto
- 🚀 Proyecto del día: La Isla del Tesoro
- 🌟 Proyecto extra: Asistente del Punto Ecológico
- 🏆 Proyecto integrador del Día 3: Informe Académico 2.0
- 🤖 Programar con apoyo de IA
- 🛠️ Correcciones técnicas al material original
- 📋 Matriz de trazabilidad
- 📦 Evidencias de aprendizaje del Día 3
0. Antes de empezar: programas que toman decisiones
(Fuente: 020 - Day 3 Goals- what we will make by the end of the day.md, 029 - Share and Show off your Project!.md)
Hasta ahora los programas se ejecutaban siempre igual, línea por línea, de arriba hacia abajo. Hoy aprenderemos a controlar el flujo: hacer que el programa siga un camino u otro según los datos que recibe.
Al final del día construirás La Isla del Tesoro, un juego de "elige tu propia aventura". El jugador toma decisiones (izquierda o derecha, nadar o esperar, qué puerta abrir) y según lo que elija gana o pierde.
El curso insiste en que el proyecto sea tuyo: cambia la historia, los mensajes y los caminos, y compártelo con tus compañeros para que lo jueguen.
Prerequisito general: Días 1 y 2:
input(), variables, conversión conint()/float(), operadores matemáticos,+=y f-strings.
🛠️ Nota técnica: el video de objetivos menciona "ámbito, namespacing global y local". Esos temas no aparecen en ninguna lección del Día 3 suministrada. En la estructura del curso, el ámbito (scope) se trabaja en el Día 12 ("Scope & Number Guessing Game"). Por eso este tutorial no los incluye.
1. Condicionales if / else y operadores de comparación
(Fuente: 022 - Control Flow with if - else and Conditional Operators.md)
Prerequisito: booleanos
True/False(Día 2, Tema 1),int(input())(Día 2, Tema 2) y el concepto de sangría (Día 1, Tema 2).
🎯 Objetivo de aprendizaje
- Escribir estructuras
if/elsecon la sintaxis correcta: dos puntos y sangría. - Usar los seis operadores de comparación.
- Distinguir entre
=(asignar) y==(comparar).
🧠 ¿Qué aprenderemos?
- ¿Qué es una condición?
- Sintaxis de
if/elsey bloques de código. - Operadores
>,<,>=,<=,==y!=. - Diagramas de flujo como herramienta de diseño.
📖 Explicación conceptual
Una situación cotidiana ¿Por qué el lavamanos no se desborda aunque olvides cerrar la llave? Porque tiene un rebosadero: si el agua supera cierto nivel, se drena; si no, el lavamanos se sigue llenando. Esa es una decisión condicional:
nivel_agua = 50
if nivel_agua > 80:
print("Drenar agua")
else:
print("Seguir llenando")Sintaxis
if condicion:
# bloque que se ejecuta si la condición es True
else:
# bloque que se ejecuta si la condición es FalseTres cosas son obligatorias:
- Las palabras clave
ifyelse. - Los dos puntos
:al final de cada una. - La sangría (4 espacios) de las líneas que pertenecen a cada bloque. La sangría es la que le dice a Python qué líneas van "dentro" del
ify cuáles "dentro" delelse.
El else va al mismo nivel de sangría que su if: los dos forman una pareja.
¿Qué es una condición?
Es cualquier expresión que se evalúa como True o False, por ejemplo altura > 120.
Operadores de comparación
| Operador | Significado | Ejemplo con altura = 120 |
Resultado |
|---|---|---|---|
> |
mayor que | altura > 120 |
False |
< |
menor que | altura < 120 |
False |
>= |
mayor o igual que | altura >= 120 |
True |
<= |
menor o igual que | altura <= 120 |
True |
== |
igual a | altura == 120 |
True |
!= |
diferente de | altura != 120 |
False |
Diagramas de flujo Antes de programar decisiones conviene dibujarlas. El curso usa draw.io (se abre en otra pestaña) para esto:
flowchart TD
A([Inicio]) --> B[/Pedir estatura/]
B --> C{¿estatura >= 120?}
C -- Sí --> D[Puede subir a la montaña rusa]
C -- No --> E[Debe crecer un poco más](El diagrama está en formato Mermaid: se visualiza en GitHub y en VS Code con una extensión de Mermaid.)
🔎 Ejemplo explicado: taquilla de la montaña rusa
Consigues trabajo en un parque de diversiones y debes programar la taquilla. Para subir a la montaña rusa hay que medir al menos 120 cm.
print("¡Bienvenido a la montaña rusa!")
altura = int(input("¿Cuál es tu estatura en cm? "))
if altura >= 120:
print("Puedes subir a la montaña rusa")
else:
print("Lo siento, debes crecer un poco más para poder subir")- Qué problema resuelve: decide si vende o no la entrada según la estatura.
- Cómo se ejecuta: con
130la condición esTruey se ejecuta el primer bloque. Con90esFalsey se ejecuta el bloqueelse. - Por qué
>=y no>: con>una persona de exactamente 120 cm quedaría por fuera. Los valores límite siempre hay que probarlos.
⚠️ Errores frecuentes
1. Olvidar los dos puntos
- Qué ocurre:
if altura >= 120sin:produceSyntaxError: expected ':'. - Cómo solucionarlo: termina con
:toda línea que empiece conif,elifoelse.
2. Usar = en lugar de ==
- Qué ocurre:
if altura = 120:produceSyntaxError. - Por qué ocurre: una condición debe dar
TrueoFalse, y una asignación no produce ninguno de los dos. - Cómo solucionarlo: usa
==para comparar.
3. Sangría incorrecta
- Qué ocurre:
IndentationError: expected an indented block, o unelseque no está alineado con suif. - Cómo solucionarlo: usa 4 espacios para cada nivel y alinea
ifyelse.
4. Comparar un texto con un número
- Qué ocurre: si olvidas
int(), entoncesaltura >= 120produceTypeError: '>=' not supported between instances of 'str' and 'int'. - Cómo solucionarlo: convierte la entrada antes de compararla (Día 2).
📝 Ejercicio original del curso: ejercicio de codificación posterior
La lección termina con "en la próxima lección, tengo un ejercicio de codificación para ti". Su enunciado no está incluido entre los archivos suministrados. Los retos siguientes cubren el mismo objetivo.
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
Pide la edad del usuario e indica si puede votar en Colombia (18 años o más).
🟡 Reto 2: Ampliación
Pide la nota de una evaluación (1.0 a 5.0) e indica si aprobó (nota mínima 3.0). Además, en ambos casos, muestra con una f-string cuánto le faltó o por cuánto superó la nota mínima.
🟠 Reto 3: Desafío
Pide dos números y muestra cuál es el mayor. Prueba el caso en que son iguales: ¿qué muestra tu programa? ¿Es correcto? Escribe en un comentario cómo lo resolverías (lo podrás hacer bien con elif en el Tema 3).
🔴 Reto 4: Pensamiento computacional
La tienda escolar da un 10 % de descuento a las compras de $20 000 o más. Diseña primero el diagrama de flujo y luego el programa: pide el valor de la compra y muestra el valor a pagar. Tus casos de prueba deben incluir obligatoriamente el valor límite.
🧩 Comprueba lo aprendido: Tema 1
- Conceptual: explica la diferencia entre
x = 5yx == 5. - Predicción: con
temperatura = 25, ¿qué evalúantemperatura != 25,temperatura >= 25ytemperatura < 25? - Análisis: ¿qué imprime este código con
edad = 18? ¿Y conedad = 17?
if edad > 18:
print("Adulto")
else:
print("Menor")¿Es correcta la lógica para Colombia? ¿Qué cambiarías?
- Depuración: este código tiene tres errores:
velocidad = input("Velocidad en km/h: ")
if velocidad > 60
print("Multa")
else:
print("Velocidad permitida")- Creación: un programa que pida la temperatura y recomiende llevar chaqueta si es menor de 15 °C.
Evidencia: diagrama de flujo y código del Reto 4.
2. El operador módulo %
(Fuente: 023 - Introducing the Modulo.md)
Prerequisito: Tema 1 y división (Día 2, Tema 3).
🎯 Objetivo de aprendizaje
- Calcular el residuo de una división con
%. - Usar el módulo dentro de una condición para saber si un número es par o impar, o si es múltiplo de otro.
🧠 ¿Qué aprenderemos?
- El operador
%(módulo). - Divisibilidad y paridad.
📖 Explicación conceptual
El operador módulo % no calcula porcentajes. Devuelve el residuo de una división entera:
| Expresión | División | Residuo |
|---|---|---|
10 % 5 |
10 ÷ 5 = 2 exacto | 0 |
10 % 3 |
10 ÷ 3 = 3 y sobra 1 | 1 |
7 % 2 |
7 ÷ 2 = 3 y sobra 1 | 1 |
12 % 2 |
12 ÷ 2 = 6 exacto | 0 |
Aplicación clave: si n % 2 == 0, el número es par. En general, si a % b == 0, entonces a es múltiplo de b.
Situación cotidiana: si repartes 10 dulces entre 3 amigos, a cada uno le tocan 3 (10 // 3) y te sobra 1 (10 % 3).
🔎 Ejemplo explicado
numero = int(input("¿Qué número quieres comprobar? "))
if numero % 2 == 0:
print("Es un número par")
else:
print("Es un número impar")- Qué hace: calcula el residuo de dividir entre 2 y lo compara con 0.
- Estrategia del curso para llegar a la solución: primero imprimir
numero % 2con varios números (12, 3, 19), observar el patrón y solo después escribir elif. Experimentar antes de decidir es una técnica de programación valiosa.
⚠️ Errores frecuentes
1. Creer que % calcula porcentajes
- Qué ocurre:
50 % 10da0, no "el 10 % de 50". - Cómo solucionarlo: para porcentajes usa
50 * 10 / 100(Día 2).
2. Escribir numero % 2 = 0
- Qué ocurre:
SyntaxError. - Cómo solucionarlo: para comparar se usa
==.
📝 Ejercicio original del curso: ¿par o impar?
Enunciado: escribe un programa que pida un número al usuario y diga si es par o impar.
Conceptos: input(), int(), %, if/else.
Resultado esperado: 45 → impar; 34 → par.
🔍 Antes de programar
- ¿Qué tipo de dato entrega
input()y cuál necesitas? - ¿Qué residuo deja cualquier número par al dividirlo entre 2?
- ¿Cómo puedes experimentar antes de escribir la condición?
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
Pide un número e indica si es múltiplo de 5.
🟡 Reto 2: Ampliación
Pide el número de estudiantes de un curso y el tamaño de los grupos de trabajo. Indica si los grupos quedan completos o, si no, cuántos estudiantes sobran. Usa // y %.
🟠 Reto 3: Desafío
Pide un número de lista e indica si el estudiante presenta el examen el lunes (número par) o el martes (impar). Si además es múltiplo de 10, debe mostrar un mensaje adicional: "Te toca borrar el tablero".
🔴 Reto 4: Pensamiento computacional: año bisiesto
Un año es bisiesto si es divisible entre 4, excepto si es divisible entre 100, salvo que también sea divisible entre 400. Diseña el diagrama de flujo y programa la solución. Casos de prueba: 2024 (sí), 1900 (no), 2000 (sí), 2023 (no). (Pista: puedes resolverlo con if anidados, que verás en el Tema 3, o con operadores lógicos, que verás en el Tema 5. Vuelve a este reto al final del día y resuélvelo de las dos formas.)
🧩 Comprueba lo aprendido: Tema 2
- Predicción: ¿cuánto dan
17 % 5,20 % 4,3 % 7y0 % 3? - Conceptual: ¿por qué
n % 2solo puede dar 0 o 1 cuandones un entero positivo? - Depuración: el programa dice "impar" cuando el número es par. ¿Por qué?
if numero % 2 == 1:
print("par")
else:
print("impar")- Creación: convierte segundos a minutos y segundos (por ejemplo, 135 s → 2 min 15 s) usando
//y%. Compara con el Reto 4 del Tema 3 del Día 2: ¿qué solución es más simple?
Evidencia: Reto 4 (año bisiesto) con sus cuatro casos de prueba verificados.
3. Condicionales anidados y elif
(Fuente: 024 - Nested if statements and elif statements.md)
Prerequisito: Tema 1.
🎯 Objetivo de aprendizaje
- Escribir condicionales dentro de otros condicionales.
- Representar tres o más alternativas con
if/elif/else. - Ordenar las condiciones correctamente.
🧠 ¿Qué aprenderemos?
ifanidado.elif("else if").- La importancia del orden de las condiciones.
📖 Explicación conceptual
if anidado
A veces una pregunta solo tiene sentido si la anterior ya se cumplió. Por ejemplo, solo vale la pena preguntar la edad para calcular el precio si la persona mide lo suficiente para subir. Para eso se escribe un if dentro del bloque de otro if, con un nivel más de sangría:
if condicion_1:
if condicion_2:
# se cumple la condición 1 Y la condición 2
else:
# se cumple la condición 1 pero NO la 2
else:
# no se cumple la condición 1 (la 2 ni se revisa)elif
Cuando hay más de dos alternativas se usa elif. Python revisa las condiciones de arriba hacia abajo y ejecuta solo el primer bloque cuya condición sea verdadera. Si ninguna se cumple, ejecuta el else.
if condicion_1:
# A
elif condicion_2:
# B (solo si la condición 1 fue False)
else:
# C (si ninguna fue True)Puedes poner tantos elif como necesites entre el if y el else.
flowchart TD
A{¿estatura >= 120?} -- No --> X[No puede subir]
A -- Sí --> B{¿edad < 12?}
B -- Sí --> P1[Entrada niño: $5]
B -- No --> C{¿edad <= 18?}
C -- Sí --> P2[Entrada joven: $7]
C -- No --> P3[Entrada adulto: $12]🔎 Ejemplo explicado: precios por edad
print("¡Bienvenido a la montaña rusa!")
altura = int(input("¿Cuál es tu estatura en cm? "))
if altura >= 120:
print("Puedes subir a la montaña rusa")
edad = int(input("¿Cuántos años tienes? "))
if edad < 12:
print("La entrada de niño cuesta $5")
elif edad <= 18:
print("La entrada de joven cuesta $7")
else:
print("La entrada de adulto cuesta $12")
else:
print("Lo siento, debes crecer un poco más para poder subir")- Por qué
elif edad <= 18no necesita decir "y mayor o igual a 12": si el programa llegó a esa línea, es porqueedad < 12fueFalse. Elelifya "sabe" que la edad es 12 o más. - Por qué la edad se pide dentro del
if: si la persona no puede subir, no tiene sentido preguntarle la edad. - Resultado esperado: con estatura 150 y edad 15 →
La entrada de joven cuesta $7.
⚠️ Errores frecuentes
1. Condiciones en un orden que las hace inalcanzables
if edad <= 18:
print("$7")
elif edad < 12: # ¡nunca se ejecuta!
print("$5")- Por qué ocurre: toda edad menor de 12 también es menor o igual a 18, así que la primera condición la atrapa antes.
- Cómo solucionarlo: ordena de la condición más restrictiva a la más general, y prueba un caso de cada rama.
2. Usar if donde debería ir elif
- Qué ocurre: pueden ejecutarse varios bloques cuando solo debería ejecutarse uno (ver Tema 4).
3. elif o else sin su if
- Qué ocurre:
SyntaxError: invalid syntax, casi siempre porque elelifo elelsequedó con una sangría distinta a la de suif.
📝 Ejercicio original del curso: desafío de codificación posterior
La lección remite a "un desafío de codificación" en la lección siguiente. Su enunciado no está incluido entre los archivos suministrados. El Reto 4 del Tema 2 (año bisiesto) y los retos siguientes cubren anidamiento y elif.
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
Completa el Reto 3 del Tema 1: dos números → "el primero es mayor", "el segundo es mayor" o "son iguales".
🟡 Reto 2: Ampliación: escala de valoración
Pide una nota (1.0 a 5.0) y muestra el desempeño según esta escala de ejemplo: Superior (4.6 a 5.0), Alto (4.0 a 4.5), Básico (3.0 a 3.9), Bajo (1.0 a 2.9). (Cada institución define su escala en su Sistema Institucional de Evaluación, el SIEE.)
🟠 Reto 3: Desafío: índice de masa corporal con interpretación
Retoma el IMC del Día 2 y clasifica el resultado: bajo peso (< 18.5), peso normal (< 25), sobrepeso (< 30), obesidad (30 o más). Aclara en un comentario que se trata de un ejercicio de programación y no de un diagnóstico médico.
🔴 Reto 4: Pensamiento computacional: tarifa de transporte escolar
La ruta escolar cobra según la distancia: hasta 3 km, $2 000; de más de 3 km hasta 8 km, $3 500; más de 8 km, $5 000. Los estudiantes con beca pagan la mitad, y la beca solo se pregunta si la distancia es mayor que 3 km. Diseña el diagrama de flujo y luego el código.
🧩 Comprueba lo aprendido: Tema 3
- Conceptual: ¿cuántos bloques de un
if/elif/elif/elsepueden ejecutarse como máximo? ¿Y como mínimo? - Predicción: con
x = 15, ¿qué imprime?
if x > 20:
print("A")
elif x > 10:
print("B")
elif x > 5:
print("C")
else:
print("D")- Depuración: corrige el error de orden del Error frecuente 1.
- Modificación: agrega al ejemplo de la montaña rusa una categoría "mayor de 60 años: $8".
Evidencia: diagrama de flujo y código del Reto 4, con un caso de prueba por cada rama.
4. Varios if seguidos
(Fuentes: 025 - Multiple If Statements in Succession.md, 026 - Pizza Order Practice.md)
Prerequisito: Tema 3 y
+=(Día 2, Tema 4).
🎯 Objetivo de aprendizaje
- Distinguir cuándo usar
if/elif/else(se ejecuta una sola opción) y cuándo usar variosifindependientes (pueden ejecutarse varios). - Acumular un valor a lo largo de varias decisiones con
+=.
🧠 ¿Qué aprenderemos?
- Condiciones independientes.
- El patrón del acumulador:
cuenta = 0y luegocuenta += .... - Por qué la sangría del
printfinal cambia el comportamiento del programa.
📖 Explicación conceptual
if / elif / else |
Varios if seguidos |
|---|---|
| Las opciones se excluyen entre sí | Las condiciones son independientes |
| Se ejecuta como máximo un bloque | Se pueden ejecutar todos los bloques cuya condición sea verdadera |
| Ej.: la categoría de edad (nadie es niño y adulto a la vez) | Ej.: comprar la foto del recuerdo, sin importar la edad |
if condicion_1:
# A
if condicion_2:
# B → se revisa siempre, aunque la condición 1 haya sido True
if condicion_3:
# C🔎 Ejemplo explicado: la foto del recuerdo
print("¡Bienvenido a la montaña rusa!")
altura = int(input("¿Cuál es tu estatura en cm? "))
cuenta = 0
if altura >= 120:
print("Puedes subir a la montaña rusa")
edad = int(input("¿Cuántos años tienes? "))
if edad < 12:
cuenta = 5
print("Entrada de niño: $5")
elif edad <= 18:
cuenta = 7
print("Entrada de joven: $7")
else:
cuenta = 12
print("Entrada de adulto: $12")
quiere_foto = input("¿Quieres una foto? Escribe S o N: ")
if quiere_foto == "S":
cuenta += 3
print(f"Tu cuenta total es ${cuenta}")
else:
print("Lo siento, debes crecer un poco más para poder subir")- Por qué
cuenta = 0al inicio: la variable debe existir antes de usar+=(Día 2). - Por qué la pregunta de la foto está alineada con
if edad < 12: la foto se ofrece a todos, sea cual sea la categoría. Si estuviera dentro delelse, solo se les ofrecería a los adultos. - Por qué no hay
elsepara la foto: si la respuesta es "no", simplemente no se suma nada. - Resultado esperado: 150 cm, 21 años y "S" →
Tu cuenta total es $15.
💡 Experimenta: cambia la sangría del
print(f"Tu cuenta total...")un nivel hacia adentro o hacia afuera y observa en qué casos se imprime y en cuáles no.
⚠️ Errores frecuentes
1. Ubicar el if independiente dentro de otra rama
- Qué ocurre: la pregunta de la foto solo aparece para algunas edades.
- Cómo solucionarlo: revisa la sangría y compárala con el diagrama de flujo.
2. Mayúsculas y minúsculas
- Qué ocurre: si el usuario escribe
sen minúscula,quiere_foto == "S"daFalse. - Por qué ocurre: para Python,
"s"y"S"son textos distintos. - Cómo solucionarlo: en el Tema 6 verás
.lower()y.upper().
3. Sangrías que no son múltiplos de 4
- Qué ocurre: el editor muestra una advertencia PEP 8. Si un mismo bloque mezcla sangrías distintas, aparece un
IndentationError. - Cómo solucionarlo: usa siempre 4 espacios por nivel.
📝 Ejercicio original del curso: Python Pizza
Enunciado: programa un sistema de pedidos de pizza que calcule la cuenta final a partir de tres preguntas: tamaño (S, M o L), si quiere pepperoni (Y o N) y si quiere queso extra (Y o N).
| Concepto | Precio |
|---|---|
| Pizza pequeña (S) | $15 |
| Pizza mediana (M) | $20 |
| Pizza grande (L) | $25 |
| Pepperoni en pizza pequeña | +$2 |
| Pepperoni en pizza mediana o grande | +$3 |
| Queso extra (cualquier tamaño) | +$1 |
Salida esperada: Your final bill is: $28. (en la versión del curso, el texto debe coincidir exactamente para pasar la verificación automática). En español puedes usar Tu cuenta final es: $28..
Conceptos: if/elif/else, if anidado, varios if seguidos, acumulador con += y f-strings.
🔍 Antes de programar
- ¿Qué decisión tiene opciones excluyentes? (una pizza solo tiene un tamaño)
- ¿Qué decisión depende de otra? (el precio del pepperoni depende del tamaño)
- ¿Qué decisión es independiente? (el queso extra)
- ¿En qué valor debe empezar la cuenta?
- Calcula en papel: L + pepperoni + sin queso = ?
Pistas del curso sobre alternativas válidas:
- Para el tamaño,
cuenta = 15ycuenta += 15funcionan igual en la primera decisión, porque la cuenta empieza en 0. - La última opción de tamaño puede ser
elseoelif tamano == "L". Agregar unelsefinal que avise "Escribiste una opción no válida" hace el programa más robusto.
Casos de prueba
| Tamaño | Pepperoni | Queso | Total |
|---|---|---|---|
| L | Y | N | $28 |
| S | Y | Y | $18 |
| M | N | Y | $21 |
| S | N | N | $15 |
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
Agrega a la pizza una opción de bebida (+$2) que se pueda pedir con cualquier tamaño.
🟡 Reto 2: Ampliación
Agrega un tamaño "XL" de $30, con pepperoni a +$4.
🟠 Reto 3: Desafío
Si el pedido total es de $25 o más, el domicilio es gratis. Si no, cuesta $3. Muestra un recibo con el subtotal, el domicilio y el total.
🔴 Reto 4: Pensamiento computacional: combo de la cafetería escolar
Diseña desde cero el menú de la cafetería: una base (empanada, arepa o sándwich, cada una con su precio), adicionales independientes (bebida y postre) y un adicional dependiente (el queso extra solo existe para la arepa). Define los precios, dibuja el diagrama y escribe al menos cinco casos de prueba antes de programar.
🧩 Comprueba lo aprendido: Tema 4
- Conceptual: da un ejemplo de tu vida cotidiana de decisiones excluyentes y otro de decisiones independientes.
- Predicción: ¿qué imprime este código con
x = 10? ¿Y si se cambian losifporif/elif/elif?
if x > 5:
print("A")
if x > 8:
print("B")
if x > 12:
print("C")- Depuración: en esta versión de la pizza, el pepperoni de una pizza pequeña cobra $5 en lugar de $2. ¿Por qué? ¿Cómo lo corriges?
if pepperoni == "Y":
if tamano == "S":
cuenta += 2
cuenta += 3Evidencia: Python Pizza funcionando con los cuatro casos de prueba.
5. Operadores lógicos and, or, not
(Fuente: 027 - Logical Operators.md)
Prerequisito: Tema 3.
🎯 Objetivo de aprendizaje
- Combinar varias condiciones en una sola línea con
andyor. - Invertir una condición con
not. - Construir y leer tablas de verdad.
🧠 ¿Qué aprenderemos?
and,or,not.- Tablas de verdad.
- Comparaciones encadenadas (
45 <= edad <= 55). - La consola interactiva de Python para experimentar.
📖 Explicación conceptual
| A | B | A and B |
A or B |
not A |
|---|---|---|---|---|
| True | True | True | True | False |
| True | False | False | True | False |
| False | True | False | True | True |
| False | False | False | False | True |
and: esTruesolo si ambas condiciones son verdaderas. Ejemplo: "puedes salir si terminaste la tarea y ordenaste el cuarto".or: esTruesi al menos una condición es verdadera. Ejemplo: "entras gratis si eres estudiante o docente".not: invierte el valor:not TrueesFalseynot FalseesTrue.
Experimenta en la consola de Python. El curso usa la consola interactiva (en PyCharm: Python Console; también puedes escribir python en una terminal), donde cada expresión se evalúa de inmediato:
>>> a = 12
>>> a > 10 and a < 13
True
>>> a > 15 and a < 13
False
>>> a > 10 or a < 10
True
>>> not a < 0
True🔎 Ejemplo explicado: entrada gratis por la "crisis de los 45"
La empresa decide regalar la entrada a las personas de 45 a 55 años (la edad típica de la llamada "crisis de la mediana edad"). La nueva condición se agrega como un elif antes del else:
if edad < 12:
cuenta = 5
print("Entrada de niño: $5")
elif edad <= 18:
cuenta = 7
print("Entrada de joven: $7")
elif edad >= 45 and edad <= 55:
print("¡Todo va a estar bien! Tu entrada es gratis")
else:
cuenta = 12
print("Entrada de adulto: $12")- Por qué no se modifica
cuentaen la rama gratuita: sigue valiendo 0. Si la persona quiere foto, igual paga los $3. - Alternativa equivalente:
elif 45 <= edad <= 55:(comparación encadenada). PyCharm la sugiere como "simplificación". El curso prefiere la versión conandmientras se aprende, porque se lee de forma más explícita. Las dos son correctas; elige la que entiendas mejor.
⚠️ Errores frecuentes
1. Escribir la condición "como se dice"
- Qué ocurre:
if respuesta == "si" or "sí":siempre daTrue. - Por qué ocurre: Python lo lee como
(respuesta == "si") or ("sí"), y un texto no vacío cuenta como verdadero. - Cómo solucionarlo: repite la comparación completa:
respuesta == "si" or respuesta == "sí".
2. Confundir and con or en los rangos
- Qué ocurre:
edad < 45 and edad > 55nunca se cumple (nadie tiene menos de 45 y más de 55 a la vez). En cambio,edad >= 45 or edad <= 55se cumple siempre. - Cómo solucionarlo: un rango "entre" usa
and, y un "fuera del rango" usaor. Prueba siempre los límites.
3. Usar &&, || o ! de otros lenguajes
- Qué ocurre:
SyntaxError. - Cómo solucionarlo: en Python los operadores lógicos se escriben con palabras:
and,or,not.
📝 Ejercicio original del curso: entrada gratis de 45 a 55 años
Enunciado: modifica el programa de la montaña rusa (Tema 4) para que las personas de 45 a 55 años, ambos incluidos, reciban la entrada gratis, pero sigan pagando la foto si la piden.
Conceptos: and, elif, orden de las condiciones.
🔍 Antes de programar
- ¿Dónde debe ir la nueva condición para que no la "atrape" otra rama antes?
- ¿Qué valores límite debes probar? (44, 45, 55 y 56)
- ¿Qué pasa con
cuentaen esa rama?
Retos adicionales (creados para esta adaptación)
🟢 Reto 1: Aplicación
Pide la temperatura e indica si está "en rango agradable" (entre 18 y 26 °C, ambos incluidos).
🟡 Reto 2: Ampliación
Un estudiante puede presentar la recuperación si su nota es menor de 3.0 y su asistencia es del 80 % o más. Pide ambos datos e informa si puede o no presentarla.
🟠 Reto 3: Desafío
Resuelve el Reto 4 del Tema 2 (año bisiesto) en una sola condición con and, or y not. Compárala con tu versión anidada: ¿cuál es más legible?
🔴 Reto 4: Pensamiento computacional: acceso a la sala de sistemas
Un estudiante puede usar la sala de sistemas en el descanso si se cumple alguna de estas situaciones: (a) es monitor de la sala; (b) tiene autorización del docente y no tiene reportes de mal uso. Además, nadie puede entrar si la sala está en mantenimiento. Define las preguntas, escribe la condición completa y construye una tabla con al menos 6 combinaciones de prueba.
🧩 Comprueba lo aprendido: Tema 5
- Predicción: con
x = 7, evalúax > 5 and x < 10,x < 5 or x > 10,not x == 7ynot (x > 5 and x < 6). - Tabla de verdad: complétala para
not A or B. - Depuración: este código dice "Fin de semana" para cualquier día. Explica por qué y corrígelo:
if dia == "sábado" or "domingo":
print("Fin de semana")- Creación: una condición que verifique que una nota es válida (entre 1.0 y 5.0) y otra, con
not, que detecte las notas inválidas.
Evidencia: tabla de pruebas del Reto 4.
6. Herramientas de texto para el proyecto
(Fuente: 028 - Day 3 Project- Treasure Island.md, sección de explicación y solución)
Durante el proyecto final, el curso introduce varias herramientas de texto que se usan en la Isla del Tesoro.
Prerequisito: strings (Día 1),
\n(Día 1, Tema 2).
🎯 Objetivo de aprendizaje
- Incluir comillas y apóstrofos dentro de un string.
- Crear strings de varias líneas.
- Comparar respuestas del usuario sin importar si las escribió en mayúsculas o minúsculas.
📖 Explicación conceptual
1. Comillas dentro de un string
print('Ella dijo: "hola"') # comillas dobles dentro de comillas simples
print("It's a trap") # apóstrofo dentro de comillas dobles
print('Type "left" or "right". It\'s your choice') # \' escapa el apóstrofoLa barra invertida \ es el carácter de escape: le dice a Python "el siguiente símbolo es texto, no código". Ya la conoces en \n.
2. Strings de varias líneas
Con tres comillas (''' o """) al abrir y al cerrar, el texto puede ocupar varias líneas. El curso lo usa para imprimir arte ASCII, dibujos hechos con caracteres (se pueden buscar en ascii.co.uk/art (se abre en otra pestaña)):
print('''
_____
/ \\
| TESORO|
\\_____/
''')(Observa que en el dibujo la \ se escribe como \\, porque de lo contrario Python la interpretaría como escape.)
3. Líneas de código largas PEP 8 recomienda que las líneas de código no sean demasiado largas. Dos strings escritos uno junto al otro dentro de paréntesis se unen automáticamente, así que se puede dividir el texto en varias líneas del código sin que cambie lo que se imprime:
eleccion = input("Estás en una encrucijada. "
"¿A dónde quieres ir? "
"Escribe 'izquierda' o 'derecha'\n")4. Ignorar mayúsculas y minúsculas con .lower()
El usuario puede escribir Izquierda, izquierda o IZQUIERDA. .lower() convierte todo a minúsculas, y así basta una sola comparación:
eleccion = input("¿Izquierda o derecha?\n").lower()
if eleccion == "izquierda":
...🛠️ Nota técnica: la transcripción llama a
lower()"función". Técnicamente es un método: una función que "pertenece" a un tipo de dato (aquí, a los strings) y se escribe después del valor, con un punto:texto.lower(). El paréntesis final es obligatorio..upper()hace lo contrario (todo a mayúsculas).
Alternativa válida mencionada por el curso: if eleccion == "izquierda" or eleccion == "Izquierda":. Funciona, pero no cubre IZQUIERDA ni iZqUiErDa. .lower() es más concisa y completa.
⚠️ Errores frecuentes
- Olvidar los paréntesis:
input(...).lowersin()no convierte nada. La comparación daráFalsesiempre. - Comparar con una palabra en mayúscula después de
.lower():if eleccion == "Izquierda":nunca se cumplirá. - Tildes:
.lower()no quita tildes, así que"sí"y"si"siguen siendo distintos. Prevé ambas opciones o pide respuestas sin tilde.
🧩 Comprueba lo aprendido: Tema 6
- Predicción: ¿qué imprime
print("PyThOn".lower() == "python")? - Depuración:
print('It's my turn')produceSyntaxError. Corrígelo de dos formas distintas. - Creación: imprime con arte ASCII el nombre o el escudo de tu colegio.
7. 🚀 Proyecto del día: La Isla del Tesoro
(Fuente: 028 - Day 3 Project- Treasure Island.md, proyecto oficial del curso original)
Problema
Crear un juego de texto tipo "elige tu propia aventura" en el que el jugador toma decisiones para encontrar un tesoro.
Contexto
Los libros de "Elige tu propia aventura" te enviaban a una página distinta según lo que decidieras. Los primeros videojuegos de aventura también eran solo texto. Hoy, muchos juegos narrativos funcionan con la misma lógica: árboles de decisiones.
Objetivo
Programar la lógica del juego según el diagrama de flujo del curso, y luego personalizar la historia.
Requisitos funcionales (lógica del curso)
flowchart TD
I([Inicio + arte ASCII]) --> Q1{Encrucijada:<br/>¿izquierda o derecha?}
Q1 -- izquierda --> Q2{Lago:<br/>¿esperar o nadar?}
Q1 -- otra respuesta --> F1[Caíste en un hueco.<br/>Game Over]
Q2 -- esperar --> Q3{Casa con 3 puertas:<br/>¿rojo, amarillo o azul?}
Q2 -- otra respuesta --> F2[Te atacó una trucha furiosa.<br/>Game Over]
Q3 -- amarillo --> W[¡Encontraste el tesoro!<br/>Ganaste]
Q3 -- rojo --> F3[Habitación en llamas.<br/>Game Over]
Q3 -- azul --> F4[Te comieron las bestias.<br/>Game Over]
Q3 -- otra --> F5[Esa puerta no existe.<br/>Game Over]- Mostrar un arte ASCII de bienvenida y el objetivo del juego.
- Primera decisión: "izquierda" continúa. Cualquier otra respuesta termina el juego.
- Segunda decisión: "esperar" continúa. Cualquier otra respuesta termina el juego.
- Tercera decisión: "amarillo" gana, "rojo" y "azul" pierden con mensajes distintos, y cualquier otra respuesta pierde.
- Las respuestas deben aceptarse sin importar mayúsculas o minúsculas.
- El cursor de cada
input()debe aparecer en una línea nueva.
Restricciones técnicas
print, input, .lower(), if/elif/else, if anidados, strings de varias líneas y caracteres de escape.
🔍 Antes de programar
- Recorre el diagrama con el dedo. ¿Cuántos finales distintos tiene el juego?
- ¿Qué preguntas solo se hacen si la anterior se respondió "bien"? ¿Qué implica eso para la sangría?
- Decisión de diseño que discute el curso: ¿es mejor escribir
if eleccion == "derecha": Game Over / else: continuaroif eleccion == "izquierda": continuar / else: Game Over? Piensa qué pasa si el usuario escribe "arriba". - En la tercera pregunta, ¿cuándo basta con
if/elsey cuándo conviene usarif/elif/else?
Construcción paso a paso
Versión 1: bienvenida. Arte ASCII con ''' y los mensajes iniciales. Ejecuta y verifica.
Versión 2: primera decisión. input(...).lower() guardado en eleccion1, y el if que valida la opción correcta primero, con el else para Game Over. Prueba izquierda, IZQUIERDA, derecha y arriba.
Versión 3: segunda decisión, anidada. La segunda pregunta va dentro del bloque de la opción correcta, con un nivel más de sangría.
Si la segunda pregunta queda por fuera del
if, se hará incluso a quien ya perdió, o aparecerá unIndentationError.
Versión 4: tercera decisión con if/elif/else. Un final distinto para cada puerta.
Versión 5: personalización. Cambia la historia, los finales, el arte ASCII y agrega \n para que el cursor quede en una línea nueva.
Pruebas: recorre todos los caminos
| Elección 1 | Elección 2 | Elección 3 | Resultado esperado |
|---|---|---|---|
| derecha | — | — | Game Over (hueco) |
| Izquierda | nadar | — | Game Over (trucha) |
| izquierda | ESPERAR | rojo | Game Over (fuego) |
| izquierda | esperar | azul | Game Over (bestias) |
| izquierda | esperar | verde | Game Over (puerta inexistente) |
| izquierda | esperar | Amarillo | ¡Ganaste! |
🧪 Prueba y depuración
Este fragmento tiene cuatro errores. Encuéntralos y clasifícalos:
eleccion1 = input("¿Izquierda o derecha?\n").lower
if eleccion1 = "izquierda":
eleccion2 = input('Llegas a un lago. ¿"esperar" o "nadar"?\n').lower()
if eleccion2 == "esperar":
print("Llegas a la isla")
else:
print("Game Over")(Pistas: un método sin paréntesis, un operador equivocado, un bloque que debería estar anidado y una línea sin la sangría obligatoria.)
⭐ Extensión del proyecto
- Agrega una cuarta decisión o un camino alternativo en la rama "derecha".
- Usa
and/or: por ejemplo, que "esperar" o "barco" sean respuestas válidas. - Lleva un puntaje con
+=que cambie según las decisiones, y muéstralo al final con una f-string. - Comparte tu versión con un compañero: ¿encuentra algún camino que no hayas probado?
8. 🌟 Proyecto extra: Asistente del Punto Ecológico
Situación
En el colegio, los estudiantes dudan frente al punto ecológico: ¿en qué caneca va cada residuo? Desde 2021 Colombia usa un código de colores nacional (Resolución 2184 de 2019):
| Caneca | Tipo de residuo | Ejemplos |
|---|---|---|
| ⚪ Blanca | Aprovechables: limpios y secos | Botellas plásticas, latas, vidrio, papel y cartón limpios |
| ⚫ Negra | No aprovechables | Servilletas usadas, papel higiénico, empaques contaminados con comida |
| 🟢 Verde | Orgánicos aprovechables | Cáscaras, restos de fruta y comida |
Objetivo
Construir un asistente que, mediante preguntas de sí/no, le indique al usuario en qué caneca depositar su residuo y le dé un consejo adicional.
Requisitos funcionales
- Preguntar si el residuo es un resto de comida o de origen orgánico. Si la respuesta es sí → caneca verde.
- Si no, preguntar de qué material es (plástico, vidrio, metal, papel, cartón u otro).
- Si es plástico, vidrio, metal, papel o cartón, preguntar si está limpio y seco:
- Si está limpio y seco → blanca.
- Si no → negra, con un consejo como "Si lo enjuagas y secas, podría aprovecharse".
- Cualquier otro material → negra.
- Aceptar las respuestas en mayúsculas o minúsculas, y aceptar tanto "si" como "sí".
Decisiones que debes tomar
- ¿Usas un
ifcon variosorpara los materiales aprovechables, o varioselif? Justifícalo. - ¿Qué haces si el usuario responde algo que no es sí ni no?
- Dibuja el diagrama de flujo antes de programar.
Casos de prueba
| ¿Orgánico? | Material | ¿Limpio y seco? | Caneca |
|---|---|---|---|
| Sí | — | — | Verde |
| no | Plástico | si | Blanca |
| No | cartón | no | Negra (con consejo) |
| no | icopor | — | Negra |
⭐ Extensión
- Lleva un contador de "puntos ecológicos" que sume más cuando el residuo es aprovechable.
- Investiga qué residuos no van en ninguna de las tres canecas (pilas, medicamentos, aparatos electrónicos) y agrega esa rama con un mensaje sobre los puntos de recolección especiales.
9. 🏆 Proyecto integrador del Día 3: Informe Académico 2.0
Proyecto integrador de este día, creado para esta adaptación. Amplía la Calculadora de Nota Definitiva (proyecto extra del Día 2) con las decisiones que aprendiste hoy. Así se ve cómo un programa evoluciona a medida que aprendes más.
Situación problema
La calculadora del Día 2 calculaba la nota, pero no decía qué significaba. Además, aceptaba notas imposibles (como 7.5) y no tenía en cuenta la asistencia.
Pregunta orientadora
¿Cómo hacer que un programa no solo calcule, sino que también interprete y valide la información?
Requerimientos
- Pedir el nombre, las tres notas (talleres 30 %, proyecto 40 % y evaluación 30 %), el número de clases del periodo y el número de fallas.
- Validar que las tres notas estén entre 1.0 y 5.0 con operadores lógicos. Si alguna es inválida, mostrar un mensaje y no calcular nada más.
- Calcular la nota definitiva y redondearla a un decimal antes de clasificarla.
- Clasificar el desempeño con
if/elif/else: Superior (4.6 o más), Alto (4.0 o más), Básico (3.0 o más), Bajo (menos de 3.0). - Calcular el porcentaje de inasistencia. Si supera el 25 %, el estudiante pierde por inasistencia sin importar la nota. Esta verificación es independiente de la clasificación.
- Mostrar un informe final con f-strings.
Restricciones técnicas
Conceptos de los Días 1 a 3. Sin ciclos ni funciones propias.
Etapas de desarrollo
- Entradas y conversión (Día 2).
- Validación con
and/oryif/elseque envuelve todo lo demás. - Cálculo y redondeo.
- Clasificación con
elif. - Verificación de inasistencia.
- Informe final y limpieza del código.
Entregables
- Archivo
.pyfuncional. - Diagrama de flujo del programa.
- Tabla de pruebas con los resultados obtenidos.
- Registro de errores y de cómo los solucionaste.
Casos de prueba
| Talleres | Proyecto | Evaluación | Clases / Fallas | Definitiva | Desempeño | Resultado |
|---|---|---|---|---|---|---|
| 4.2 | 4.8 | 3.6 | 40 / 2 | 4.3 | Alto | Aprueba |
| 5.0 | 4.8 | 4.5 | 40 / 0 | 4.8 | Superior | Aprueba |
| 3.0 | 3.0 | 3.0 | 40 / 10 | 3.0 | Básico | Aprueba (25 % no supera el límite) |
| 2.9 | 3.0 | 3.0 | 40 / 4 | 3.0 | Básico | Aprueba (2.97 se redondea a 3.0) |
| 2.0 | 2.5 | 3.0 | 40 / 0 | 2.5 | Bajo | No aprueba |
| 4.2 | 4.8 | 3.6 | 40 / 12 | 4.3 | Alto | Pierde por inasistencia (30 %) |
| 5.5 | 4.0 | 4.0 | — | — | — | "Nota inválida" |
💡 El cuarto caso muestra por qué el orden de redondear y comparar importa: sin redondear, 2.97 sería "Bajo". Discute con tu grupo cuál criterio es más justo; muchas instituciones lo definen en su SIEE.
Criterios técnicos de funcionamiento
- Todos los casos de prueba producen el resultado esperado.
- Una nota inválida detiene el procesamiento con un mensaje claro.
- Los valores límite (3.0, 4.0, 4.6 y 25 %) se clasifican correctamente.
- El código es legible: nombres descriptivos, comentarios por bloque y sangría consistente.
Posibles extensiones
- Si el desempeño es Bajo pero la definitiva es 2.5 o más, indicar que puede presentar recuperación.
- Calcular qué nota necesitaría en la evaluación para alcanzar Básico.
- Validar también que las fallas no superen el número de clases.
10. 🤖 Programar con apoyo de IA
Hoy el curso mostró dos situaciones en las que el editor, con ayuda automatizada, sugiere cambios: la "comparación encadenada simplificada" y el reformateo automático de líneas largas. La instructora aceptó una y rechazó la otra por razones de legibilidad. Esa es la actitud correcta: la sugerencia de una herramienta es una propuesta, no una orden.
Proceso:
- Diseña tu diagrama de flujo antes de pedir ayuda.
- Si consultas una IA, dale tu diagrama y tu código, y pregúntale por qué falla, no solo que lo arregle.
- Verifica cada sugerencia con tus casos de prueba, sobre todo los valores límite.
- Explica con tus palabras, en un comentario, lo que cambiaste.
Actividad: detectar errores de la IA. Pide a una IA: "Escribe en Python un programa que clasifique la edad en niño (menor de 12), joven (12 a 18) y adulto". Luego:
- Revisa si la IA probó los valores 11, 12, 18 y 19.
- Revisa si usó
<o<=correctamente en los límites. - Comprueba si convirtió la entrada con
int(). - Escribe un informe corto: ¿qué hizo bien?, ¿qué tuviste que corregir?, ¿cómo lo verificaste?
11. 🛠️ Correcciones técnicas al material original
| Archivo | Afirmación en la transcripción | Qué ocurre realmente | Tratamiento en este tutorial |
|---|---|---|---|
020 |
El día cubre "ámbito, namespacing global y local" | Ninguna lección suministrada del Día 3 trata ese tema. En el curso aparece en el Día 12 | Nota en la sección 0 |
027 |
"El operador not sólo funciona cuando la condición es falsa" | not invierte cualquier valor booleano: not True es False y not False es True |
Explicación correcta en el Tema 5 |
028 |
lower() se describe como "función" |
Es un método de los strings: texto.lower() |
Nota técnica en el Tema 6 |
025 |
La comparación quiere_foto == "Y" |
Distingue mayúsculas: si el usuario escribe y, la condición es False |
Error frecuente 2 del Tema 4, con enlace a .lower() |
026 |
La advertencia "sangría no múltiplo de cuatro" | Es una advertencia de estilo (PEP 8). Mezclar sangrías distintas en un mismo bloque sí produce IndentationError |
Error frecuente 3 del Tema 4 |
12. 📋 Matriz de trazabilidad
| Contenido original | Archivo de origen | Concepto desarrollado | Ejercicio original | Reto adicional | Proyecto relacionado |
|---|---|---|---|---|---|
| Objetivos: juego de aventura | 020 |
Sección 0 | — | — | Sección 7 |
Rebosadero, if/else, comparación, = vs ==, diagramas de flujo |
022 |
Tema 1 | Ejercicio de codificación posterior (mencionado, no suministrado) | Retos 1–4 del Tema 1 (voto, aprobación, descuento) | Proyectos 7, 8 y 9 |
| Operador módulo, par/impar | 023 |
Tema 2 | ¿Par o impar? | Retos 1–4 del Tema 2 (grupos, año bisiesto) | Integrador (inasistencia) |
if anidado, elif, precios por edad |
024 |
Tema 3 | Desafío posterior (mencionado, no suministrado) | Retos 1–4 del Tema 3 (escala de valoración, IMC, ruta) | Proyectos 7 y 9 |
Varios if, acumulador, foto |
025 |
Tema 4 | — (ejemplo guiado) | — | Proyecto 9 |
| Python Pizza | 026 |
Tema 4 | Python Pizza (enunciado, precios y solución) | Retos 1–4 del Tema 4 (combo de la cafetería) | — |
and, or, not, entrada gratis de 45 a 55 |
027 |
Tema 5 | Entrada gratis de 45 a 55 años | Retos 1–4 del Tema 5 (sala de sistemas) | Proyectos 8 y 9 |
Escape \, ''', líneas largas, .lower(), arte ASCII |
028 |
Tema 6 | — | Comprueba lo aprendido, Tema 6 | Proyecto 7 |
| La Isla del Tesoro | 028 |
Integración de los Temas 1–6 | Proyecto oficial completo | Depuración con 4 errores y extensiones | Sección 7 |
| Compartir el proyecto | 029 |
Secciones 0 y 7 | — | Extensión: probar el juego de un compañero | Sección 7 |
| (No existe en el curso original) | — | — | — | Asistente del Punto Ecológico | Sección 8 |
| (No existe en el curso original) | — | — | — | Informe Académico 2.0 | Sección 9 |
13. 📦 Evidencias de aprendizaje del Día 3
- La Isla del Tesoro personalizada, con evidencia de haber recorrido los 6 caminos de la tabla de pruebas.
- Python Pizza funcionando con los 4 casos de prueba.
- Al menos dos diagramas de flujo hechos antes de programar (por ejemplo, el del Reto 4 del Tema 3 y el del proyecto extra o el integrador).
- Código de uno de los proyectos adicionales (Punto Ecológico o Informe Académico 2.0).
- Tabla de verdad y tabla de pruebas del Reto 4 del Tema 5.
- Cuaderno de errores actualizado:
SyntaxError: expected ':',IndentationError: expected an indented block,TypeErroral compararstrconinty errores de lógica (condiciones inalcanzables oormal usado). - Informe de la actividad de IA sobre los valores límite.