Funciones en Python: Parámetros, *args, **kwargs y Decoradores

👤 Admin 📅 12 de noviembre, 2025 ⏱ 14 min 🏷 Python Básico

¿Qué son las Funciones?

Las funciones son bloques de código reutilizable que realizan una tarea específica. Ayudan a organizar el código y evitar repetición.

Definir Funciones

# Función básica
def saludar():
    print("¡Hola, mundo!")

saludar()  # Llamar la función

# Función con parámetros
def saludar_persona(nombre):
    print(f"¡Hola, {nombre}!")

saludar_persona("Ana")  # ¡Hola, Ana!

Return - Retornar Valores

def suma(a, b):
    return a + b

resultado = suma(5, 3)
print(resultado)  # 8

# Retornar múltiples valores
def operaciones(a, b):
    return a + b, a - b, a * b

s, r, m = operaciones(10, 5)
print(f"Suma: {s}, Resta: {r}, Multiplicación: {m}")

Parámetros por Defecto

def saludar(nombre="Usuario", mensaje="Bienvenido"):
    print(f"{mensaje}, {nombre}!")

saludar()  # Bienvenido, Usuario!
saludar("Ana")  # Bienvenido, Ana!
saludar("Luis", "Hola")  # Hola, Luis!

Argumentos por Posición y Nombre

def presentar(nombre, edad, ciudad):
    print(f"{nombre} tiene {edad} años y vive en {ciudad}")

# Por posición
presentar("Ana", 25, "Madrid")

# Por nombre (keyword arguments)
presentar(ciudad="Barcelona", nombre="Luis", edad=30)

# Mixto
presentar("María", edad=28, ciudad="Sevilla")

*args - Argumentos Variables

# Acepta cualquier cantidad de argumentos
def sumar_todos(*numeros):
    total = 0
    for num in numeros:
        total += num
    return total

print(sumar_todos(1, 2, 3))  # 6
print(sumar_todos(1, 2, 3, 4, 5))  # 15
print(sumar_todos(10, 20))  # 30

**kwargs - Argumentos con Nombre Variables

def mostrar_info(**datos):
    for clave, valor in datos.items():
        print(f"{clave}: {valor}")

mostrar_info(nombre="Ana", edad=25, ciudad="Madrid")
# nombre: Ana
# edad: 25
# ciudad: Madrid

# Combinando *args y **kwargs
def funcion_completa(*args, **kwargs):
    print("Args:", args)
    print("Kwargs:", kwargs)

funcion_completa(1, 2, 3, nombre="Ana", edad=25)

Funciones Lambda

Funciones anónimas de una sola línea:

# Sintaxis: lambda argumentos: expresión

# Función normal
def cuadrado(x):
    return x ** 2

# Equivalente con lambda
cuadrado_lambda = lambda x: x ** 2

print(cuadrado_lambda(5))  # 25

# Con múltiples argumentos
suma = lambda a, b: a + b
print(suma(3, 7))  # 10

# Uso con map()
numeros = [1, 2, 3, 4, 5]
cuadrados = list(map(lambda x: x**2, numeros))
print(cuadrados)  # [1, 4, 9, 16, 25]

# Uso con filter()
pares = list(filter(lambda x: x % 2 == 0, numeros))
print(pares)  # [2, 4]

Scope - Ámbito de Variables

# Variable global
x = 10

def funcion():
    # Variable local
    y = 20
    print(f"Dentro: x={x}, y={y}")

funcion()
print(f"Fuera: x={x}")
# print(y)  # Error: y no existe fuera

# Modificar variable global
contador = 0

def incrementar():
    global contador
    contador += 1

incrementar()
print(contador)  # 1

Funciones Recursivas

# Factorial
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))  # 120

# Fibonacci
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(7))  # 13

Decoradores Básicos

Los decoradores modifican el comportamiento de funciones:

def mi_decorador(funcion):
    def envoltura():
        print("Antes de la función")
        funcion()
        print("Después de la función")
    return envoltura

@mi_decorador
def saludar():
    print("¡Hola!")

saludar()
# Salida:
# Antes de la función
# ¡Hola!
# Después de la función

Docstrings - Documentación

def calcular_area(base, altura):
    """
    Calcula el área de un triángulo.
    
    Args:
        base (float): La base del triángulo
        altura (float): La altura del triángulo
    
    Returns:
        float: El área del triángulo
    """
    return (base * altura) / 2

# Ver documentación
print(calcular_area.__doc__)

Ejemplos Prácticos

Validador de Email

def validar_email(email):
    if "@" in email and "." in email:
        return True
    return False

print(validar_email("usuario@example.com"))  # True
print(validar_email("invalido"))  # False

Calculadora

def calculadora(num1, num2, operacion):
    operaciones = {
        "suma": lambda a, b: a + b,
        "resta": lambda a, b: a - b,
        "multiplicacion": lambda a, b: a * b,
        "division": lambda a, b: a / b if b != 0 else "Error"
    }
    return operaciones.get(operacion, lambda a, b: "Operación inválida")(num1, num2)

print(calculadora(10, 5, "suma"))  # 15

Generador de Contraseñas

import random
import string

def generar_password(longitud=12):
    caracteres = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(random.choice(caracteres) for _ in range(longitud))
    return password

print(generar_password())  # Contraseña aleatoria
print(generar_password(20))  # Contraseña de 20 caracteres

Conclusión

Las funciones son fundamentales para escribir código limpio, organizado y reutilizable. Domina estos conceptos para convertirte en un mejor programador Python.