Realiza los Ejercicios en celdas sucesivas de Jupyter Notebook
La solución es una de las posibles (no hay una sola respuesta)
Conceptos Clave sobre Condicionales
Condicionales: Permiten que el programa tome decisiones basadas en condiciones.
Estructuras:ifelifelsematch/case
Operadores: ==, !=, <, >, <=, >=, in, not in, is, is not
Lógicos: and, or, not
1
Condicional básico if
Fácil
Problema: Crea una variable edad = 18. Si la edad es mayor o igual a 18, imprime "Eres mayor de edad", sino imprime "Eres menor de edad".
✅ Solución:
edad = 18
if edad >= 18:
print("Eres mayor de edad")
else:
print("Eres menor de edad")
Explicación: El if evalúa una condición. Si es verdadera ejecuta el bloque, sino ejecuta el else.
2
Múltiples condiciones con elif
Fácil
Problema: Crea una variable nota = 85. Clasifica la nota: 90-100 = "Excelente", 80-89 = "Bueno", 70-79 = "Regular", 60-69 = "Suficiente", menos de 60 = "Insuficiente".
✅ Solución:
nota = 85
if nota >= 90:
print("Excelente")
elif nota >= 80:
print("Bueno")
elif nota >= 70:
print("Regular")
elif nota >= 60:
print("Suficiente")
else:
print("Insuficiente")
Explicación:elif permite evaluar múltiples condiciones en orden. Se ejecuta el primer bloque cuya condición sea verdadera.
3
Operadores lógicos
Fácil
Problema: Crea variables llueve = True y tengo_paraguas = False. Si llueve Y no tengo paraguas, imprime "Me voy a mojar". Si llueve Y tengo paraguas, imprime "Estoy preparado". Si no llueve, imprime "Buen día para salir".
✅ Solución:
llueve = True
tengo_paraguas = False
if llueve and not tengo_paraguas:
print("Me voy a mojar")
elif llueve and tengo_paraguas:
print("Estoy preparado")
else:
print("Buen día para salir")
Explicación: Los operadores and, or, not combinan condiciones booleanas.
4
Inclusión en listas
Fácil
Problema: Crea una lista frutas = ["manzana", "plátano", "naranja"] y una variable fruta_elegida = "plátano". Verifica si la fruta elegida está en la lista e imprime un mensaje apropiado.
✅ Solución:
frutas = ["manzana", "plátano", "naranja"]
fruta_elegida = "plátano"
if fruta_elegida in frutas:
print(f"¡Genial! {fruta_elegida} está disponible")
else:
print(f"Lo siento, {fruta_elegida} no está disponible")
Explicación: El operador in verifica si un elemento está presente en una lista, tupla o string.
5
Inclusión en diccionarios
Medio
Problema: Crea un diccionario precios = {"manzana": 1.50, "plátano": 0.80, "naranja": 1.20}. Pregunta por una fruta y muestra su precio si existe, o un mensaje de no disponible.
✅ Solución:
precios = {"manzana": 1.50, "plátano": 0.80, "naranja": 1.20}
fruta = "manzana" # Simula input del usuario
if fruta in precios:
print(f"El precio de {fruta} es {precios[fruta]}€")
else:
print(f"No tenemos {fruta} disponible")
Explicación:in verifica si una clave existe en un diccionario antes de acceder a su valor.
6
Operador ternario
Medio
Problema: Crea una variable temperatura = 25. Usa el operador ternario para asignar "Calor" si es mayor a 20, o "Frío" si es menor o igual, y guárdalo en una variable sensacion.
✅ Solución:
temperatura = 25
sensacion = "Calor" if temperatura > 20 else "Frío"
print(f"Con {temperatura}°C siento {sensacion}")
Explicación: El operador ternario valor_si_true if condicion else valor_si_false es una forma concisa de escribir if-else.
7
Validación de rangos
Fácil
Problema: Crea una variable numero = 45. Verifica si está en el rango de 1 a 100 (inclusivo) e imprime un mensaje apropiado.
✅ Solución:
numero = 45
if 1 <= numero <= 100:
print(f"{numero} está en el rango válido (1-100)")
else:
print(f"{numero} está fuera del rango válido")
Explicación: Python permite comparaciones encadenadas como 1 <= numero <= 100.
8
Match/Case básico
Medio
Problema: Crea una variable dia = "lunes". Usa match/case para imprimir diferentes mensajes según el día de la semana.
✅ Solución:
dia = "lunes"
match dia:
case "lunes" | "martes" | "miércoles" | "jueves" | "viernes":
print("Día laboral - A trabajar!")
case "sábado":
print("¡Sábado de descanso!")
case "domingo":
print("Domingo de relajación")
case _:
print("Día no válido")
Explicación:match/case (Python 3.10+) es como switch. El | permite múltiples valores y _ es el caso por defecto.
9
Validación de contraseña
Medio
Problema: Crea una variable password = "Python123". Valida que tenga al menos 8 caracteres, contenga al menos un número y al menos una letra mayúscula.
✅ Solución:
password = "Python123"
tiene_longitud = len(password) >= 8
tiene_numero = any(char.isdigit() for char in password)
tiene_mayuscula = any(char.isupper() for char in password)
if tiene_longitud and tiene_numero and tiene_mayuscula:
print("✅ Contraseña válida")
else:
print("❌ Contraseña inválida")
if not tiene_longitud:
print(" - Debe tener al menos 8 caracteres")
if not tiene_numero:
print(" - Debe contener al menos un número")
if not tiene_mayuscula:
print(" - Debe contener al menos una mayúscula")
Explicación: Combinamos múltiples condiciones y usamos métodos de string como isdigit() y isupper().
10
Calculadora simple con match
Medio
Problema: Crea variables a = 10, b = 5, operacion = "+". Usa match/case para realizar la operación correspondiente (+, -, *, /, %).
✅ Solución:
a = 10
b = 5
operacion = "+"
match operacion:
case "+":
resultado = a + b
case "-":
resultado = a - b
case "*":
resultado = a * b
case "/":
if b != 0:
resultado = a / b
else:
resultado = "Error: División por cero"
case "%":
if b != 0:
resultado = a % b
else:
resultado = "Error: División por cero"
case _:
resultado = "Operación no válida"
print(f"{a} {operacion} {b} = {resultado}")
Explicación:match/case es ideal para manejar diferentes opciones. Incluimos validación para evitar división por cero.
11
Verificación de tipos
Medio
Problema: Crea una variable dato = 42. Usa match/case con patterns para determinar el tipo de dato y mostrar un mensaje específico.
✅ Solución:
dato = 42
match dato:
case int() if dato > 0:
print(f"Es un entero positivo: {dato}")
case int() if dato < 0:
print(f"Es un entero negativo: {dato}")
case int():
print(f"Es cero: {dato}")
case str():
print(f"Es un string: '{dato}'")
case float():
print(f"Es un decimal: {dato}")
case bool():
print(f"Es un booleano: {dato}")
case _:
print(f"Tipo no reconocido: {type(dato)}")
Explicación:match/case puede usar patterns con tipos y guards (condiciones con if).
Explicación: El orden de las condiciones importa. Verificamos primero la condición más específica.
13
Verificación de membresía
Fácil
Problema: Crea un conjunto usuarios_vip = {"ana", "juan", "maria"} y una variable usuario = "juan". Verifica si el usuario es VIP e imprime beneficios o mensaje de upgrade.
✅ Solución:
usuarios_vip = {"ana", "juan", "maria"}
usuario = "juan"
if usuario in usuarios_vip:
print(f"¡Bienvenido {usuario}! Eres usuario VIP")
print("Beneficios: envío gratis, descuentos exclusivos, soporte prioritario")
else:
print(f"Hola {usuario}, considera upgradearte a VIP")
print("¡Obtén envío gratis y descuentos exclusivos!")
Explicación: Los conjuntos (sets) son muy eficientes para verificar membresía con in.
14
Clasificador de triángulos
Difícil
Problema: Crea variables a = 5, b = 5, c = 5 (lados de un triángulo). Determina si es válido y clasifícalo como equilátero, isósceles o escaleno.
✅ Solución:
a = 5
b = 5
c = 5
# Primero verificamos si es un triángulo válido
if a + b > c and a + c > b and b + c > a:
print("✅ Es un triángulo válido")
# Clasificamos el tipo de triángulo
if a == b == c:
print("Tipo: Equilátero (todos los lados iguales)")
elif a == b or a == c or b == c:
print("Tipo: Isósceles (dos lados iguales)")
else:
print("Tipo: Escaleno (todos los lados diferentes)")
else:
print("❌ No es un triángulo válido")
Explicación: Un triángulo es válido si la suma de dos lados es mayor al tercero. Clasificamos por igualdad de lados.
15
Sistema de calificación de películas
Medio
Problema: Crea variables edad = 16 y pelicula = "R" (G, PG, PG-13, R). Determina si la persona puede ver la película según las clasificaciones de edad.
✅ Solución:
edad = 16
pelicula = "R"
match pelicula:
case "G":
print("✅ Película apta para todas las edades")
puede_ver = True
case "PG":
print("Se recomienda supervisión parental")
puede_ver = True
case "PG-13":
if edad >= 13:
print("✅ Puedes ver la película")
puede_ver = True
else:
print("❌ Necesitas tener al menos 13 años")
puede_ver = False
case "R":
if edad >= 17:
print("✅ Puedes ver la película")
puede_ver = True
else:
print("❌ Necesitas tener al menos 17 años")
puede_ver = False
case _:
print("Clasificación no válida")
puede_ver = False
if puede_ver:
print("🍿 ¡Disfruta la película!")
else:
print("📚 Mejor estudia o ve algo más apropiado")
Explicación: Combinamos match/case con condicionales internos para validar edad según clasificación.
16
Validador de email simple
Medio
Problema: Crea una variable email = "usuario@ejemplo.com". Valida que contenga exactamente un "@", que tenga texto antes y después del "@", y que termine en ".com" o ".es".
✅ Solución:
email = "usuario@ejemplo.com"
tiene_arroba = email.count("@") == 1
terminaciones_validas = [".com", ".es", ".org", ".net"]
tiene_terminacion_valida = any(email.endswith(term) for term in terminaciones_validas)
if tiene_arroba:
partes = email.split("@")
usuario = partes[0]
dominio = partes[1]
tiene_usuario = len(usuario) > 0
tiene_dominio = len(dominio) > 0 and "." in dominio
else:
tiene_usuario = False
tiene_dominio = False
if tiene_arroba and tiene_usuario and tiene_dominio and tiene_terminacion_valida:
print("✅ Email válido")
else:
print("❌ Email inválido")
if not tiene_arroba:
print(" - Debe contener exactamente un @")
if not tiene_usuario:
print(" - Debe tener usuario antes del @")
if not tiene_dominio:
print(" - Debe tener dominio después del @")
if not tiene_terminacion_valida:
print(" - Debe terminar en .com, .es, .org o .net")
Explicación: Validación paso a paso usando métodos de string como count(), split() y endswith().
17
Juego de piedra, papel o tijera
Medio
Problema: Crea variables jugador = "piedra" y maquina = "papel". Implementa la lógica del juego y determina quién gana usando match/case.
✅ Solución:
jugador = "piedra"
maquina = "papel"
print(f"Jugador: {jugador}")
print(f"Máquina: {maquina}")
if jugador == maquina:
print("🤝 ¡Empate!")
else:
match (jugador, maquina):
case ("piedra", "tijera") | ("papel", "piedra") | ("tijera", "papel"):
print("🎉 ¡Ganaste!")
case ("tijera", "piedra") | ("piedra", "papel") | ("papel", "tijera"):
print("😔 Perdiste...")
case _:
print("❌ Jugada no válida")
# Explicación de la jugada
match (jugador, maquina):
case ("piedra", "tijera"):
print("La piedra rompe las tijeras")
case ("papel", "piedra"):
print("El papel envuelve la piedra")
case ("tijera", "papel"):
print("Las tijeras cortan el papel")
case _:
pass
Explicación: Usamos tuplas en match/case para comparar combinaciones de jugadas. El operador | permite múltiples patrones.
18
Clasificador de IMC avanzado
Difícil
Problema: Crea variables peso = 70, altura = 1.75, edad = 25, sexo = "M". Calcula el IMC y clasifícalo considerando edad y sexo para dar recomendaciones específicas.
✅ Solución:
peso = 70
altura = 1.75
edad = 25
sexo = "M" # M = Masculino, F = Femenino
imc = peso / (altura ** 2)
# Clasificación básica del IMC
if imc < 18.5:
categoria = "Bajo peso"
color = "🔵"
elif imc < 25:
categoria = "Peso normal"
color = "🟢"
elif imc < 30:
categoria = "Sobrepeso"
color = "🟡"
else:
categoria = "Obesidad"
color = "🔴"
print(f"IMC: {imc:.1f}")
print(f"Categoría: {color} {categoria}")
# Recomendaciones específicas por edad y sexo
if edad < 18:
print("⚠️ Consulta con un pediatra para evaluación apropiada")
elif edad > 65:
print("👴 Los rangos pueden variar en adultos mayores")
if sexo == "M":
if 20 <= imc <= 25:
print("✅ Rango óptimo para hombres")
elif imc > 25:
print("💪 Considera ejercicio de fuerza y cardio")
else: # Femenino
if 19 <= imc <= 24:
print("✅ Rango óptimo para mujeres")
elif imc < 19:
print("🥗 Considera aumentar ingesta calórica saludable")
# Recomendación general
match categoria:
case "Bajo peso":
print("📈 Recomendación: Aumentar peso gradualmente")
case "Peso normal":
print("🎯 Recomendación: Mantener estilo de vida saludable")
case "Sobrepeso":
print("📉 Recomendación: Reducir peso moderadamente")
case "Obesidad":
print("🏥 Recomendación: Consultar con profesional de salud")
Explicación: Combinamos cálculos matemáticos con múltiples condicionales para dar consejos personalizados.
19
Sistema de autenticación
Difícil
Problema: Crea un diccionario usuarios = {"admin": "123", "user": "abc"}, variables usuario = "admin", password = "123", intentos = 1. Simula un sistema de login con límite de intentos.
✅ Solución:
usuarios = {"admin": "123", "user": "abc", "guest": "456"}
usuario = "admin"
password = "123"
intentos = 1
max_intentos = 3
print(f"🔐 Intento de login #{intentos}")
print(f"Usuario: {usuario}")
# Verificar si el usuario existe
if usuario not in usuarios:
print("❌ Usuario no encontrado")
print("📝 ¿Necesitas registrarte?")
else:
# Verificar contraseña
if usuarios[usuario] == password:
print("✅ Login exitoso")
# Permisos según tipo de usuario
match usuario:
case "admin":
print("👑 Acceso de administrador")
print(" - Gestionar usuarios")
print(" - Ver reportes")
print(" - Configuración del sistema")
case "user":
print("👤 Acceso de usuario estándar")
print(" - Ver perfil")
print(" - Editar datos personales")
case "guest":
print("👀 Acceso de invitado")
print(" - Solo lectura")
case _:
print("🔒 Acceso básico")
else:
print("❌ Contraseña incorrecta")
intentos_restantes = max_intentos - intentos
if intentos_restantes > 0:
print(f"⚠️ Te quedan {intentos_restantes} intentos")
else:
print("🚫 Cuenta bloqueada por múltiples intentos fallidos")
print("🕐 Intenta de nuevo en 30 minutos")
Explicación: Sistema completo que verifica existencia de usuario, valida contraseña, gestiona intentos y asigna permisos.
20
Analizador de datos de ventas
Difícil
Problema: Crea variables ventas = [150, 200, 180, 300, 250], meta = 200, vendedor = "Ana". Analiza el rendimiento, calcula comisiones y determina bonificaciones.
✅ Solución:
ventas = [150, 200, 180, 300, 250]
meta = 200
vendedor = "Ana"
# Cálculos básicos
total_ventas = sum(ventas)
promedio_ventas = total_ventas / len(ventas)
ventas_sobre_meta = [v for v in ventas if v >= meta]
dias_sobre_meta = len(ventas_sobre_meta)
print(f"=== REPORTE DE VENTAS - {vendedor} ===")
print(f"Total vendido: ${total_ventas}")
print(f"Promedio diario: ${promedio_ventas:.1f}")
print(f"Meta diaria: ${meta}")
print(f"Días que superó la meta: {dias_sobre_meta}/{len(ventas)}")
# Análisis de rendimiento
porcentaje_exito = (dias_sobre_meta / len(ventas)) * 100
if porcentaje_exito >= 80:
rendimiento = "Excelente"
emoji = "🌟"
elif porcentaje_exito >= 60:
rendimiento = "Bueno"
emoji = "👍"
elif porcentaje_exito >= 40:
rendimiento = "Regular"
emoji = "👌"
else:
rendimiento = "Necesita mejorar"
emoji = "📈"
print(f"Rendimiento: {emoji} {rendimiento} ({porcentaje_exito:.1f}%)")
# Sistema de comisiones
comision_base = 0.05 # 5%
if total_ventas >= 1000:
comision_total = comision_base + 0.02 # +2% extra
bonus_descripcion = "Bonus por volumen alto"
elif promedio_ventas >= meta:
comision_total = comision_base + 0.01 # +1% extra
bonus_descripcion = "Bonus por superar meta promedio"
else:
comision_total = comision_base
bonus_descripcion = "Sin bonus"
comision_ganada = total_ventas * comision_total
print(f"\n💰 COMISIONES:")
print(f"Comisión base: {comision_base*100}%")
print(f"Comisión total: {comision_total*100}%")
print(f"Dinero ganado: ${comision_ganada:.2f}")
print(f"Bonus: {bonus_descripcion}")
# Recomendaciones
print(f"\n📋 RECOMENDACIONES:")
if promedio_ventas < meta:
diferencia = meta - promedio_ventas
print(f"- Aumentar ventas en ${diferencia:.1f} diarios para alcanzar meta")
if max(ventas) >= 300:
print("- ¡Excelente! Tienes potencial para ventas altas")
if min(ventas) < meta * 0.8:
print("- Trabajar en consistencia, evitar días de ventas muy bajas")
Explicación: Análisis completo que combina operaciones con listas, cálculos estadísticos, sistema de bonificaciones y recomendaciones personalizadas.