UT4: Funciones y módulos¶
Introducción¶
Bienvenid@s a la Unidad de Trabajo 4 (UT4) del módulo profesional optativo (MPO) de Python. En esta unidad, nos centraremos en el concepto de funciones y módulos, dos elementos fundamentales para estructurar y organizar nuestro código de manera eficiente. Las funciones nos permiten encapsular bloques de código que realizan tareas específicas, mientras que los módulos nos permiten agrupar funciones relacionadas en archivos separados, facilitando la reutilización y el mantenimiento del código.
Perfecto. A continuación tienes el material teórico ampliado sobre funciones en Python, pensado para alumnado de 1º de DAM, en el módulo de Programación. Incluye definiciones detalladas, analogías, ejemplos comentados y consejos didácticos.
Funciones¶
Una función es un bloque de código con nombre que se puede ejecutar cuando se necesite. Sirve para resolver una tarea específica y puede recibir datos (llamados parámetros) y devolver un resultado (valor de retorno).
Piensa en una función como una máquina: Le das ingredientes (parámetros), hace un trabajo (instrucciones), y puede darte un resultado (valor de retorno).
Ventajas de usar funciones¶
- Reutilización de código: Escribes una vez, usas muchas.
- Modularidad: Puedes dividir un programa en partes más pequeñas, claras y fáciles de entender.
- Facilita la prueba de errores: Puedes probar una función de forma aislada.
- Mejora la legibilidad: Los programas con funciones bien nombradas se entienden mejor.
¿Cómo se define una función en Python?¶
Sintaxis básica¶
def nombre_funcion(parámetros):
"""Descripción de lo que hace la función (opcional pero recomendable)"""
instrucciones
return valor # opcional
Detalle de cada parte¶
def
: palabra reservada que indica que se va a definir una función.nombre_funcion
: identificador que le damos a la función. Se recomienda usar minúsculas y guiones bajos (snake_case
) si tiene varias palabras.parámetros
: variables que recibe la función como entrada (pueden ser cero o más).return
: sirve para devolver un resultado desde la función (es opcional).
Ejemplos¶
Ejemplo 1: Función sin parámetros ni retorno¶
def saludar():
print("Hola, bienvenido al curso de DAM")
saludar()
Esta función no necesita datos externos. Simplemente ejecuta una instrucción (mostrar un mensaje).
Ejemplo 2: Función con parámetros¶
def saludar_persona(nombre):
print(f"Hola, {nombre}. ¡Bienvenido!")
saludar_persona("Laura")
Aquí, la función recibe un valor externo (
nombre
) y lo usa para personalizar el saludo. Los parámetros permiten hacer funciones más flexibles.
Ejemplo 3: Función con retorno (return
)¶
def sumar(a, b):
resultado = a + b
return resultado
total = sumar(5, 3)
print("La suma es:", total)
Esta función devuelve un valor. La palabra clave
return
se usa para enviar el resultado de vuelta al lugar donde fue llamada. Es muy útil cuando necesitamos que la función nos diga el resultado de su operación.
Ejemplo 4: Función con valores por defecto¶
def saludar(nombre="invitado"):
print(f"Hola, {nombre}")
saludar() # Hola, invitado
saludar("Carlos") # Hola, Carlos
Si el usuario no proporciona un valor, se usa el valor por defecto (
"invitado"
). Esto hace que la función sea más flexible.
Ejemplo 5: Función con múltiples valores de retorno¶
def operaciones(a, b):
suma = a + b
resta = a - b
return suma, resta
x, y = operaciones(10, 4)
print("Suma:", x)
print("Resta:", y)
Python permite devolver varios valores separados por comas, y luego se pueden recoger en varias variables.
Buenas prácticas al crear funciones¶
- Usa nombres descriptivos: que indiquen claramente qué hace la función (
calcular_area
,obtener_precio
, etc.). - Añade comentarios o docstrings (
"""texto"""
) para explicar la función. - Divide tareas complejas en varias funciones más simples.
- No dependas de variables externas (globales) dentro de una función.
- Procura que cada función haga una sola cosa. Esto se llama el principio de responsabilidad única.
¿Cuándo usar funciones?¶
- Siempre que tengas código que se repite
- Siempre que una parte del programa pueda separarse y probarse sola
- Cuando quieras organizar tu programa de forma modular
Módulos¶
¿Qué es un módulo?¶
Un módulo es un archivo con extensión .py
que contiene código Python organizado para ser reutilizado. Este código puede incluir:
- Funciones (bloques de código reutilizables)
- Clases (plantillas para crear objetos)
- Variables (datos almacenados)
- Código ejecutable (que se corre al importar el módulo)
Ejemplo visual:
proyecto/
│
├── main.py # Programa principal
└── mis_modulos/
├── calculadora.py # Módulo con funciones matemáticas
└── utils.py # Módulo con utilidades varias
Beneficios clave:
- Organización: Divide programas grandes en archivos más pequeños y manejables.
- Reutilización: Usa el mismo código en múltiples proyectos sin copiar/pegar.
- Encapsulamiento: Oculta detalles complejos detrás de interfaces simples.
Cómo importar módulos¶
Importación básica¶
import math
print(math.pi) # 3.141592653589793
- Accedes a los elementos con la notación
módulo.elemento
- Ideal cuando necesitas muchos elementos del módulo
Importación selectiva¶
from math import sqrt, pow
print(pow(2, 3)) # 8.0
- Ventaja: No necesitas prefijar con el nombre del módulo
- Riesgo: Posibles conflictos de nombres
Importación con alias¶
import numpy as np
print(np.array([1, 2, 3])) # Crea un array de NumPy
- Especialmente útil para:
- Módulos con nombres largos
- Librerías de visualización de datos
- Cuando trabajas con múltiples módulos similares
Importación avanzada¶
from statistics import (
mean as promedio,
median as mediana,
stdev as desviacion
)
- Permite renombrar funciones para mayor claridad
- Útil cuando los nombres originales son muy técnicos
Creación de módulos personalizados¶
Estructura típica:¶
mi_proyecto/
│
├── main.py
└── modulo_ventas/
├── __init__.py # Para convertir en paquete
├── clientes.py
└── facturacion.py
Ejemplo completo:
geometria.py
"""Módulo para cálculos geométricos básicos"""
# Constante del módulo
PI = 3.1416
def area_circulo(radio):
"""Calcula el área de un círculo"""
return PI * radio ** 2
def perimetro_rectangulo(largo, ancho):
return 2 * (largo + ancho)
# Código que se ejecuta al importar
print("Módulo geometría cargado correctamente")
main.py
from geometria import area_circulo, PI
print(f"El valor de PI es: {PI}")
print(f"Área de círculo radio 5: {area_circulo(5)}")
Notas importantes:
- El archivo
__init__.py
(aunque vacío) convierte un directorio en un paquete Python - El código fuera de funciones se ejecuta al importar el módulo
Módulos estándar más importantes¶
Matemáticas (math
)¶
import math
# Constantes
print(math.pi) # 3.141592...
print(math.e) # 2.718281...
# Funciones
print(math.factorial(5)) # 120
print(math.gcd(12, 18)) # Máximo común divisor: 6
print(math.radians(180)) # Convierte a radianes: 3.1415...
Fechas y horas (datetime
)¶
from datetime import datetime, timedelta
hoy = datetime.now()
print(hoy.strftime("%d/%m/%Y")) # Formatea fecha: "11/06/2025"
mañana = hoy + timedelta(days=1)
diferencia = mañana - hoy
print(diferencia.total_seconds()) # 86400.0
Sistema operativo (os
)¶
import os
# Rutas
print(os.getcwd()) # Directorio actual
os.mkdir("nueva_carpeta") # Crear directorio
# Variables de entorno
print(os.environ.get('PATH'))
Aleatoriedad (random
)¶
import random
# Números aleatorios
print(random.uniform(1.5, 2.5)) # Float entre 1.5 y 2.5
# Selecciones
colores = ["rojo", "verde", "azul"]
print(random.sample(colores, 2)) # 2 elementos aleatorios
Buenas prácticas con módulos¶
- Nombres descriptivos:
calculadora.py
mejor quemod1.py
- Documentación: Usa docstrings para explicar el módulo
- Evitar
from modulo import *
: Puede causar conflictos