MAD-UdelaR: Ejercicios de Funciones en Python
Daniel Miles Touya
Realiza los Ejercicios en celdas sucesivas de Jupyter Notebook
La solución es una de las posibles (no hay una sola respuesta)
Funciones: Bloques de código reutilizable que realizan una tarea específica.
Sintaxis: def return parámetros argumentos
Beneficios: Reutilización, organización, legibilidad y facilidad de testing
Estructura: def nombre_funcion(parametros): → return resultado
saludar() que no reciba parámetros y que imprima "¡Hola, mundo!" cuando se llame. Luego llama a la función para probarla.
✅ Solución:
Explicación: Una función se define con def, seguido del nombre y paréntesis. Para ejecutarla, escribimos su nombre seguido de ().
saludar_persona(nombre) que reciba un nombre como parámetro e imprima "¡Hola, [nombre]!". Pruébala con diferentes nombres.
✅ Solución:
Explicación: Los parámetros van dentro de los paréntesis. Podemos usar el valor del parámetro dentro de la función como si fuera una variable.
sumar(a, b) que reciba dos números y devuelva su suma usando return. Guarda el resultado en una variable e imprímelo.
✅ Solución:
Explicación: return devuelve un valor desde la función. Podemos guardar ese valor en una variable o usarlo directamente.
presentar_persona(nombre, edad, ciudad) que reciba tres parámetros y devuelva un texto como: "Me llamo [nombre], tengo [edad] años y vivo en [ciudad]".
✅ Solución:
Explicación: Las funciones pueden recibir múltiples parámetros separados por comas. El orden importa al llamar la función.
calcular_area_rectangulo(ancho, alto=1) que calcule el área de un rectángulo. Si no se proporciona la altura, debe usar 1 por defecto (será un cuadrado).
✅ Solución:
Explicación: Los parámetros pueden tener valores por defecto usando =. Si no pasamos ese argumento, usa el valor por defecto.
crear_perfil(nombre, edad, profesion="Estudiante", activo=True) que muestre información de un perfil de usuario. Prueba llamándola de diferentes formas: con argumentos posicionales, con keywords, y mezclando ambos.
✅ Solución:
Explicación: Los keyword arguments permiten llamar funciones especificando el nombre del parámetro. Esto hace el código más legible y permite cambiar el orden de los argumentos.
sumar_todos(*numeros) que pueda recibir cualquier cantidad de números y devuelva su suma. Pruébala con diferentes cantidades de argumentos.
✅ Solución:
Explicación: *args permite que una función reciba cualquier cantidad de argumentos posicionales. Dentro de la función, args es una tupla con todos los valores.
saludar_grupo(saludo, *nombres) que reciba un saludo fijo y luego cualquier cantidad de nombres. Debe imprimir el saludo personalizado para cada persona.
✅ Solución:
Explicación: Podemos combinar parámetros normales con *args. Los parámetros fijos van primero, seguidos de *args que captura el resto.
calculadora(operacion, *numeros) que pueda realizar diferentes operaciones matemáticas (suma, multiplicación, máximo, mínimo) sobre cualquier cantidad de números.
✅ Solución:
Explicación: Podemos usar *args para crear funciones flexibles que manejen diferentes cantidades de datos. Útil para operaciones matemáticas que pueden aplicarse a conjuntos variables.
analizar_ventas(*ventas, mostrar_detalle=True, currency="€") que pueda analizar cualquier cantidad de datos de ventas y generar estadísticas completas con visualización opcional.
✅ Solución:
Explicación: Este ejercicio combina *args con análisis estadístico real: cálculo de mediana, cuartiles, desviación estándar, histogramas y comparaciones. Demuestra cómo *args es fundamental en ciencia de datos para funciones flexibles.
ejemplo_argumentos(pos1, pos2, default1="valor", default2="otro", *args, kw_only, **kwargs) que demuestre todos los tipos de argumentos. Explora qué pasa si cambias el orden o llamas la función incorrectamente.
✅ Solución:
Explicación: Los argumentos en Python tienen un orden específico: posicionales → defaults → *args → keyword-only → **kwargs. El orden en las llamadas también importa: posicionales antes que keywords.
*args y **kwargs vs "unpacking" (desempaquetar) al llamar una función. Crea ejemplos que muestren ambos conceptos claramente.
✅ Solución:
Explicación: PACKING ocurre en la definición (*args, **kwargs recogen argumentos). UNPACKING ocurre en la llamada (*lista, **dict dispersan elementos). Son operaciones inversas.
✅ Solución:
Explicación: Los argumentos inmutables (int, str) crean nuevos objetos al "modificarse". Los mutables (list, dict) se modifican directamente. Los defaults mutables son peligrosos porque se reutilizan entre llamadas.
*args para entender cómo Python empaqueta argumentos en una tupla. Copia el código en PythonTutor y observa cómo se forma la tupla args.
✅ Solución para PythonTutor:
Para PythonTutor: Observa cómo los argumentos individuales (10, 20, 30) se empaquetan en la tupla args = (10, 20, 30). Ve paso a paso cómo el bucle itera sobre cada elemento.
**kwargs para entender cómo Python empaqueta argumentos con nombre en un diccionario. Observa en PythonTutor cómo se crea el diccionario kwargs.
✅ Solución para PythonTutor:
Para PythonTutor: Observa cómo los argumentos con nombre (nombre="Ana", edad=25) se empaquetan en el diccionario kwargs = {'nombre': 'Ana', 'edad': 25}. Ve cómo .items() itera sobre pares clave-valor.
*args como **kwargs para ver cómo Python separa argumentos posicionales y con nombre. Ideal para visualizar el proceso completo en PythonTutor.
✅ Solución para PythonTutor:
Para PythonTutor: Este es el ejemplo más completo. Observa cómo Python separa automáticamente argumentos posicionales en args (tupla) y argumentos con nombre en kwargs (diccionario). Ve también el proceso inverso de unpacking.
Proceso de aprendizaje recomendado:
1. Ejecuta el código base - Ve el gráfico inicial
2. Cambia UN parámetro - Modifica solo color, luego ejecuta
3. Observa el efecto - ¿Cómo cambió el gráfico?
4. Prueba otro parámetro - Ahora cambia el marker
5. Combina efectos - Color + marker + linestyle
6. Crea tu estilo - Inventa combinaciones únicas
⚡ Experimentos rápidos:
• Cambia color='blue' → color='red'
• Cambia marker='o' → marker='*'
• Cambia linestyle='-' → linestyle='--'
• Cambia linewidth=2 → linewidth=5
🎯 Objetivo: Entender cómo **kwargs hace que matplotlib sea tan flexible y poderoso para visualización de datos.
graficar(x, y, **kwargs) para crear gráficos personalizables con matplotlib. Experimenta cambiando diferentes parámetros para ver cómo afectan al gráfico visualmente.
✅ Solución:
Explicación: **kwargs permite pasar cualquier parámetro de estilo a matplotlib. Experimenta cambiando color, linestyle, marker, linewidth y markersize para ver cómo afectan visualmente al gráfico.
✅ Solución:
Explicación: **kwargs permite crear funciones flexibles que aceptan cualquier parámetro de matplotlib. Esto es especialmente útil para crear dashboards y gráficos personalizables donde el usuario puede experimentar con diferentes estilos visuales.