Ejercicios Prácticos

¡Pon a prueba tus conocimientos de funciones!

🎯 Desafío de la Clase

Completa todos los ejercicios para dominar las funciones en Python. Cada ejercicio te ayudará a entender mejor cómo crear y usar funciones efectivamente.

🐙 Recuerda: Sube todos tus ejercicios a GitHub para seguir practicando el uso de esta herramienta y llevar un registro de tu progreso.

Ejercicio 1: Función de Saludo Personalizado

Fácil

Crea una función llamada saludar_persona que tome dos parámetros: nombre y hora. La función debe devolver un saludo apropiado según la hora del día:

💡 Pista

Usa condicionales (if, elif, else) dentro de tu función para determinar qué saludo mostrar.

✅ Solución

def saludar_persona(nombre, hora):
    if hora < 12:
        return f"¡Buenos días, {nombre}!"
    elif hora < 18:
        return f"¡Buenas tardes, {nombre}!"
    else:
        return f"¡Buenas noches, {nombre}!"

# Pruebas
print(saludar_persona("Ana", 9)) # ¡Buenos días, Ana!
print(saludar_persona("Carlos", 15)) # ¡Buenas tardes, Carlos!
print(saludar_persona("María", 20)) # ¡Buenas noches, María!

Ejercicio 2: Calculadora de Estadísticas

Medio

Crea una función llamada calcular_estadisticas que tome una lista de números y devuelva un diccionario con:

💡 Pista

Usa las funciones built-in de Python como sum(), max(), min() y len().

✅ Solución

def calcular_estadisticas(numeros):
    if len(numeros) == 0:
        return "La lista está vacía"
    estadisticas = {
        "suma": sum(numeros),
        "promedio": sum(numeros) / len(numeros),
        "maximo": max(numeros),
        "minimo": min(numeros),
        "cantidad": len(numeros)
    }
    return estadisticas

# Pruebas
numeros = [10, 20, 30, 40, 50]
resultado = calcular_estadisticas(numeros)
print(resultado)
# {'suma': 150, 'promedio': 30.0, 'maximo': 50, 'minimo': 10, 'cantidad': 5}

Ejercicio 3: Validador de Contraseña

Medio

Crea una función llamada validar_password que tome una contraseña como parámetro y devuelva True si cumple con los siguientes criterios:

💡 Pista

Usa métodos de string como isupper(), islower(), isdigit() y verifica si los caracteres están en una lista de caracteres especiales.

✅ Solución

def validar_password(password): if len(password) < 8: return False tiene_mayuscula = False tiene_minuscula = False tiene_numero = False tiene_especial = False caracteres_especiales = "!@#$%^&*" for caracter in password: if caracter.isupper(): tiene_mayuscula = True elif caracter.islower(): tiene_minuscula = True elif caracter.isdigit(): tiene_numero = True elif caracter in caracteres_especiales: tiene_especial = True return tiene_mayuscula and tiene_minuscula and tiene_numero and tiene_especial # Pruebas print(validar_password("Abc123!")) # True print(validar_password("password")) # False print(validar_password("12345678")) # False

Ejercicio 4: Filtrar Números Pares e Impares

Medio

Crea una función llamada filtrar_pares_impares que reciba una lista de números y devuelva dos listas: una con los números pares y otra con los impares.

💡 Pista

Puedes usar el operador módulo % para saber si un número es par o impar.

✅ Solución

def filtrar_pares_impares(numeros): pares = [n for n in numeros if n % 2 == 0] impares = [n for n in numeros if n % 2 != 0] return pares, impares # Pruebas pares, impares = filtrar_pares_impares([1, 2, 3, 4, 5, 6]) print("Pares:", pares) # [2, 4, 6] print("Impares:", impares) # [1, 3, 5]

Ejercicio 5: Contador de Palabras Únicas

Medio

Crea una función llamada contar_palabras_unicas que reciba una cadena de texto y devuelva cuántas palabras únicas contiene (ignorando mayúsculas/minúsculas y signos de puntuación).

💡 Pista

Puedes usar el método .split() y el módulo string para quitar puntuación.

✅ Solución

import string def contar_palabras_unicas(texto): texto = texto.lower() for p in string.punctuation: texto = texto.replace(p, "") palabras = texto.split() return len(set(palabras)) # Prueba print(contar_palabras_unicas("¡Hola mundo! Hola, Python. Mundo...")) # 3

Ejercicio 6: Invertir Palabras en una Frase

Medio

Crea una función llamada invertir_palabras que reciba una cadena de texto y devuelva una nueva cadena con el orden de las palabras invertido.

💡 Pista

Puedes usar el método .split() y luego .join().

✅ Solución

def invertir_palabras(frase): palabras = frase.split() return ' '.join(reversed(palabras)) # Prueba print(invertir_palabras("Hola mundo Python")) # "Python mundo Hola"

Ejercicio 7: Sumar Solo Números Positivos

Medio

Crea una función llamada sumar_positivos que reciba una lista de números y devuelva la suma de solo los números positivos.

💡 Pista

Puedes usar una condición dentro de la comprensión de listas.

✅ Solución

def sumar_positivos(numeros): return sum(n for n in numeros if n > 0) # Prueba print(sumar_positivos([1, -2, 3, 0, -5, 7])) # 11

Ejercicio 8: Generador de Fibonacci

Difícil

Crea una función llamada fibonacci que genere los primeros n números de la secuencia de Fibonacci. La función debe usar argumentos variables (*args) para aceptar diferentes parámetros:

💡 Pista

Usa len(args) para determinar cuántos argumentos se pasaron y ajusta la lógica en consecuencia.

✅ Solución

def fibonacci(*args): if len(args) == 0: return "Debes pasar al menos un argumento" if len(args) == 1: # Generar n números n = args[0] secuencia = [0, 1] for i in range(2, n): secuencia.append(secuencia[i-1] + secuencia[i-2]) return secuencia[:n] elif len(args) == 2: # Generar hasta que el siguiente sea mayor al límite limite = args[1] secuencia = [0, 1] while secuencia[-1] <= limite: siguiente = secuencia[-1] + secuencia[-2] if siguiente > limite: break secuencia.append(siguiente) return secuencia elif len(args) == 3: # Generar en un rango específico inicio, fin, paso = args secuencia = [0, 1] while secuencia[-1] <= fin: siguiente = secuencia[-1] + secuencia[-2] if siguiente > fin: break secuencia.append(siguiente) # Filtrar por rango resultado = [num for num in secuencia if inicio <= num <= fin] return resultado[::paso] if paso > 0 else resultado # Pruebas print(fibonacci(8)) # [0, 1, 1, 2, 3, 5, 8, 13] print(fibonacci(0, 20)) # [0, 1, 1, 2, 3, 5, 8, 13] print(fibonacci(5, 15, 2)) # [5, 8, 13]

Ejercicio 9: Decorador Personalizado

Difícil

Crea un decorador llamado medir_tiempo que mida el tiempo de ejecución de cualquier función y muestre cuánto tiempo tardó en ejecutarse.

💡 Pista

Usa el módulo time para medir el tiempo. Un decorador es una función que toma otra función como argumento y retorna una nueva función.

✅ Solución

import time def medir_tiempo(funcion): def wrapper(*args, **kwargs): inicio = time.time() resultado = funcion(*args, **kwargs) fin = time.time() tiempo_total = fin - inicio print(f"La función {funcion.__name__} tardó {tiempo_total:.4f} segundos en ejecutarse") return resultado return wrapper # Ejemplo de uso @medir_tiempo def funcion_lenta(): for i in range(1000000): pass return "¡Listo!" @medir_tiempo def sumar_numeros(*numeros): return sum(numeros) # Pruebas funcion_lenta() sumar_numeros(1, 2, 3, 4, 5)

🚀 ¡Muy bien, has completado los ejercicios!

Ya dominas las funciones en Python. Ahora estás listo para avanzar al siguiente reto y aplicar tus conocimientos en un proyecto real.

Ir al Proyecto Final