Skip to content

8. Funciones en Python

🎯 8.1 ¿Qué es una función y para qué sirve?

Section titled “🎯 8.1 ¿Qué es una función y para qué sirve?”

Una función es un bloque de código reutilizable que realiza una tarea específica. Es una de las herramientas fundamentales para organizar y estructurar programas de manera eficiente.

PropósitoDescripción
ReutilizaciónEvita duplicar código escribiendo una vez y usando múltiples veces
ModularidadDivide programas complejos en partes más pequeñas y manejables
AbstracciónOculta detalles de implementación, mostrando solo la interfaz
MantenibilidadFacilita actualizar y corregir código en un solo lugar
LegibilidadHace el código más claro y fácil de entender
ComponenteDescripción
DefiniciónDeclaración de la función con def
NombreIdentificador único para llamar la función
ParámetrosVariables que recibe la función (opcional)
CuerpoBloque de código que ejecuta la función
RetornoValor que devuelve la función (opcional)

Una función es como una receta de cocina: defines los pasos una vez (ingredientes = parámetros, procedimiento = cuerpo) y puedes usarla cada vez que necesites preparar ese platillo (llamada a la función).

Comparación
# SIN FUNCIONES (código repetitivo)
print("Hola, Ana")
print("Bienvenida al sistema")
print("---")
print("Hola, Juan")
print("Bienvenido al sistema")
print("---")
print("Hola, María")
print("Bienvenida al sistema")
print("---")
# CON FUNCIONES (código reutilizable)
def saludar(nombre):
print(f"Hola, {nombre}")
print("Bienvenido al sistema")
print("---")
saludar("Ana")
saludar("Juan")
saludar("María")
Ventajas
# Calcular área de rectángulo sin función
base1 = 5
altura1 = 3
area1 = base1 * altura1
print(f"Área 1: {area1}")
base2 = 8
altura2 = 4
area2 = base2 * altura2
print(f"Área 2: {area2}")
# Con función (más limpio y reutilizable)
def calcular_area_rectangulo(base, altura):
return base * altura
area1 = calcular_area_rectangulo(5, 3)
area2 = calcular_area_rectangulo(8, 4)
print(f"Área 1: {area1}")
print(f"Área 2: {area2}")

def nombre_funcion(parametros):
"""Docstring: descripción de la función"""
# Cuerpo de la función
return valor # Opcional
ElementoDescripción
defPalabra clave para definir una función
nombre_funcionIdentificador de la función (debe seguir reglas de nombres)
parametrosVariables que recibe (entre paréntesis, separados por comas)
docstringDocumentación opcional (entre triple comillas)
returnDevuelve un valor (opcional, si no hay return, devuelve None)
  • Indentación: El cuerpo de la función debe estar indentado (4 espacios)
  • Definición antes de uso: La función debe definirse antes de llamarla
  • Nombres descriptivos: Usar nombres que indiquen qué hace la función
  • Convención: Usar snake_case para nombres de funciones
Función simple
# Función que no recibe parámetros ni retorna valor
def saludar():
print("¡Hola, mundo!")
# Llamar la función
saludar() # Salida: ¡Hola, mundo!
saludar() # Salida: ¡Hola, mundo!
Con parámetros
# Función que recibe parámetros
def saludar_persona(nombre):
print(f"Hola, {nombre}!")
# Llamar con diferentes argumentos
saludar_persona("Ana") # Hola, Ana!
saludar_persona("Carlos") # Hola, Carlos!
Con return
# Función que retorna un valor
def sumar(a, b):
resultado = a + b
return resultado
# Usar el valor retornado
total = sumar(5, 3)
print(total) # 8
# Usar directamente en expresiones
print(sumar(10, 20)) # 30
Con docstring
def calcular_area_circulo(radio):
"""
Calcula el área de un círculo.
Args:
radio (float): Radio del círculo
Returns:
float: Área del círculo
"""
pi = 3.14159
area = pi * radio ** 2
return area
# Usar la función
area = calcular_area_circulo(5)
print(f"Área: {area:.2f}")
# Ver documentación
print(calcular_area_circulo.__doc__)

🔄 8.3 Parámetros, argumentos y valores de retorno

Section titled “🔄 8.3 Parámetros, argumentos y valores de retorno”
ConceptoDescripción
ParámetrosVariables definidas en la declaración de la función
ArgumentosValores reales pasados al llamar la función
TipoDescripción
PosicionalesSe pasan en el orden definido
Por nombre (keyword)Se especifica el nombre del parámetro
MixtosCombinación de posicionales y por nombre
TipoDescripción
return simpleDevuelve un solo valor
return múltipleDevuelve varios valores (tupla)
sin returnLa función retorna None implícitamente
  • Paso por referencia: Los objetos mutables se pasan por referencia
  • Múltiples returns: Una función puede tener varios return (solo se ejecuta uno)
  • Return termina ejecución: El código después de return no se ejecuta
Argumentos posicionales
# Función con múltiples parámetros
def presentar(nombre, edad, ciudad):
print(f"Me llamo {nombre}")
print(f"Tengo {edad} años")
print(f"Vivo en {ciudad}")
# Argumentos posicionales (orden importa)
presentar("Ana", 25, "Madrid")
# Salida:
# Me llamo Ana
# Tengo 25 años
# Vivo en Madrid
Argumentos por nombre
def presentar(nombre, edad, ciudad):
print(f"{nombre}, {edad} años, {ciudad}")
# Argumentos por nombre (orden no importa)
presentar(edad=30, ciudad="Barcelona", nombre="Carlos")
# Mezclar posicionales y por nombre
presentar("María", ciudad="Valencia", edad=28)
Return simple
# Función que retorna un valor
def cuadrado(numero):
return numero ** 2
resultado = cuadrado(5)
print(resultado) # 25
# Usar en expresiones
print(cuadrado(3) + cuadrado(4)) # 9 + 16 = 25
Return múltiple
# Función que retorna múltiples valores
def operaciones(a, b):
suma = a + b
resta = a - b
multiplicacion = a * b
return suma, resta, multiplicacion
# Recibir múltiples valores
s, r, m = operaciones(10, 5)
print(f"Suma: {s}") # 15
print(f"Resta: {r}") # 5
print(f"Multiplicación: {m}") # 50
# O recibir como tupla
resultados = operaciones(8, 3)
print(resultados) # (11, 5, 24)
Sin return
# Función sin return (retorna None)
def imprimir_tabla(numero):
for i in range(1, 6):
print(f"{numero} x {i} = {numero * i}")
resultado = imprimir_tabla(5)
print(f"Retorno: {resultado}") # None
Return temprano
# Usar return para salir temprano
def dividir(a, b):
if b == 0:
print("Error: División por cero")
return None
return a / b
print(dividir(10, 2)) # 5.0
print(dividir(10, 0)) # Error: División por cero, None

⚙️ 8.4 Funciones con valores por defecto

Section titled “⚙️ 8.4 Funciones con valores por defecto”

Los valores por defecto (o parámetros opcionales) permiten definir valores predeterminados para parámetros. Si no se proporciona un argumento al llamar la función, se usa el valor por defecto.

def funcion(parametro1, parametro2=valor_defecto):
# código
  • Orden: Parámetros con valores por defecto deben ir después de los obligatorios
  • Flexibilidad: Permite llamar la función con menos argumentos
  • Sobrescritura: Se puede proporcionar un valor diferente al llamar
  • Valores mutables: Evitar usar listas o diccionarios como valores por defecto
  • Mayor flexibilidad al llamar funciones
  • Reduce la necesidad de múltiples versiones de la misma función
  • Hace el código más limpio y fácil de usar
Valores por defecto
# Función con valor por defecto
def saludar(nombre, saludo="Hola"):
print(f"{saludo}, {nombre}!")
# Usar valor por defecto
saludar("Ana") # Hola, Ana!
# Proporcionar valor personalizado
saludar("Carlos", "Buenos días") # Buenos días, Carlos!
saludar("María", saludo="Buenas tardes") # Buenas tardes, María!
Múltiples valores
def crear_perfil(nombre, edad=18, ciudad="Madrid", activo=True):
print(f"Nombre: {nombre}")
print(f"Edad: {edad}")
print(f"Ciudad: {ciudad}")
print(f"Activo: {activo}")
# Usar todos los valores por defecto
crear_perfil("Ana")
# Sobrescribir algunos valores
crear_perfil("Carlos", edad=25)
# Usar argumentos por nombre
crear_perfil("María", ciudad="Barcelona", edad=30)

Ejemplo: Función de potencia con exponente por defecto

Section titled “Ejemplo: Función de potencia con exponente por defecto”
Potencia
def potencia(base, exponente=2):
"""Calcula la potencia de un número."""
return base ** exponente
# Usar valor por defecto (cuadrado)
print(potencia(5)) # 25 (5^2)
print(potencia(3)) # 9 (3^2)
# Especificar exponente
print(potencia(2, 3)) # 8 (2^3)
print(potencia(5, 3)) # 125 (5^3)
Formato de precio
def formatear_precio(precio, moneda="EUR", decimales=2):
"""Formatea un precio con moneda."""
return f"{precio:.{decimales}f} {moneda}"
# Usar valores por defecto
print(formatear_precio(19.99)) # 19.99 EUR
# Cambiar moneda
print(formatear_precio(25.5, "USD")) # 25.50 USD
# Cambiar decimales
print(formatear_precio(100, decimales=0)) # 100 EUR
# Cambiar todo
print(formatear_precio(49.999, "MXN", 1)) # 50.0 MXN

📐 8.5 Buenas prácticas al nombrar funciones

Section titled “📐 8.5 Buenas prácticas al nombrar funciones”
ConvenciónDescripción
snake_caseUsar minúsculas con guiones bajos (calcular_promedio)
Verbos descriptivosComenzar con verbos que indiquen la acción
Nombres clarosSer específico sobre qué hace la función
Evitar abreviaturasPreferir nombres completos y legibles
PrefijoUsoEjemplo
get_ / obtener_Obtener un valorobtener_nombre()
set_ / establecer_Establecer un valorestablecer_precio()
es_ / is_Verificar condición (bool)es_valido()
tiene_ / has_Verificar existencia (bool)tiene_permiso()
calcular_Realizar cálculoscalcular_total()
validar_Validar datosvalidar_email()
formatear_Formatear datosformatear_fecha()
  • Única responsabilidad: Una función debe hacer una sola cosa
  • Nombres autodocumentados: El nombre debe explicar qué hace
  • Consistencia: Usar el mismo estilo en todo el código
  • Longitud apropiada: Ni muy corto ni muy largo (2-4 palabras ideal)
Buenos vs malos
# ❌ MALOS NOMBRES
def f(x): # No descriptivo
return x * 2
def calc(a, b): # Abreviatura confusa
return a + b
def datos(): # Muy genérico
return [1, 2, 3]
# ✅ BUENOS NOMBRES
def duplicar_numero(numero):
return numero * 2
def calcular_suma(primer_numero, segundo_numero):
return primer_numero + segundo_numero
def obtener_numeros_primos():
return [2, 3, 5, 7, 11]
Verbos descriptivos
# Funciones con verbos claros
def obtener_edad_usuario():
return 25
def calcular_area_rectangulo(base, altura):
return base * altura
def validar_email(email):
return "@" in email
def formatear_fecha(dia, mes, anio):
return f"{dia:02d}/{mes:02d}/{anio}"
def es_numero_par(numero):
return numero % 2 == 0
def tiene_mayusculas(texto):
return any(c.isupper() for c in texto)

Ejemplo: Funciones con nombres autodocumentados

Section titled “Ejemplo: Funciones con nombres autodocumentados”
Autodocumentados
# El nombre explica claramente qué hace
def convertir_celsius_a_fahrenheit(celsius):
return (celsius * 9/5) + 32
def calcular_precio_con_descuento(precio, descuento):
return precio * (1 - descuento / 100)
def obtener_primer_elemento_lista(lista):
return lista[0] if lista else None
def verificar_si_es_mayor_de_edad(edad):
return edad >= 18
# Uso claro sin necesidad de documentación adicional
temperatura_f = convertir_celsius_a_fahrenheit(25)
precio_final = calcular_precio_con_descuento(100, 20)
primer_item = obtener_primer_elemento_lista([1, 2, 3])
es_mayor = verificar_si_es_mayor_de_edad(20)
Consistencia
# Módulo de gestión de usuarios - Nombres consistentes
def obtener_usuario_por_id(user_id):
"""Obtiene un usuario por su ID."""
pass
def obtener_usuario_por_email(email):
"""Obtiene un usuario por su email."""
pass
def crear_usuario(nombre, email):
"""Crea un nuevo usuario."""
pass
def actualizar_usuario(user_id, datos):
"""Actualiza los datos de un usuario."""
pass
def eliminar_usuario(user_id):
"""Elimina un usuario."""
pass
def validar_datos_usuario(datos):
"""Valida los datos de un usuario."""
pass
# Patrón consistente: verbo + sustantivo + complemento
Funciones booleanas
# Funciones que retornan booleano: usar es_, tiene_, puede_
def es_numero_primo(numero):
"""Verifica si un número es primo."""
if numero < 2:
return False
for i in range(2, numero):
if numero % i == 0:
return False
return True
def tiene_caracteres_especiales(texto):
"""Verifica si el texto tiene caracteres especiales."""
especiales = "!@#$%^&*()_+-=[]{}|;:,.<>?"
return any(c in especiales for c in texto)
def puede_votar(edad):
"""Verifica si una persona puede votar."""
return edad >= 18
def esta_vacio(lista):
"""Verifica si una lista está vacía."""
return len(lista) == 0
# Uso intuitivo en condicionales
if es_numero_primo(7):
print("Es primo")
if tiene_caracteres_especiales("abc!"):
print("Tiene caracteres especiales")

🐝