Funciones en Python: con y sin paréntesis
Funciones en Python: con y sin paréntesis
Te explico la diferencia fundamental entre usar funciones con y sin paréntesis en Python:
1. Función CON paréntesis: Ejecución
Cuando usas paréntesis después del nombre de una función, estás ejecutando o llamando esa función:
def saludar():
return "¡Hola!"
# Con paréntesis - EJECUTA la función
mensaje = saludar()
print(mensaje) # Output: ¡Hola!2. Función SIN paréntesis: Referencia
Cuando usas el nombre sin paréntesis, estás haciendo referencia a la función como objeto:
def saludar():
return "¡Hola!"
# Sin paréntesis - REFERENCIA a la función
mi_funcion = saludar
print(mi_funcion) # Output: <function saludar at 0x...>
# Ahora puedes ejecutarla usando la referencia
print(mi_funcion()) # Output: ¡Hola!Ejemplos prácticos
Ejemplo 1: Funciones como objetos de primera clase
def sumar(a, b):
return a + b
def multiplicar(a, b):
return a * b
# Asignar funciones a variables (sin paréntesis)
operacion = sumar
resultado = operacion(5, 3) # Ahora sí usamos paréntesis para ejecutar
print(resultado) # Output: 8
# Cambiar la operación
operacion = multiplicar
resultado = operacion(5, 3)
print(resultado) # Output: 15Ejemplo 2: Callbacks y funciones de orden superior
def procesar_datos(datos, funcion_procesadora):
"""Aplica una función a cada elemento de los datos"""
return [funcion_procesadora(dato) for dato in datos]
def duplicar(x):
return x * 2
def cuadrado(x):
return x ** 2
datos = [1, 2, 3, 4]
# Pasamos la referencia a la función (sin paréntesis)
resultado1 = procesar_datos(datos, duplicar)
print(resultado1) # Output: [2, 4, 6, 8]
resultado2 = procesar_datos(datos, cuadrado)
print(resultado2) # Output: [1, 4, 9, 16]Ejemplo 3: Métodos de clase
class Persona:
def __init__(self, nombre):
self.nombre = nombre
def presentarse(self):
return f"Hola, soy {self.nombre}"
persona = Persona("Ana")
# Con paréntesis - EJECUTA el método
print(persona.presentarse()) # Output: Hola, soy Ana
# Sin paréntesis - REFERENCIA al método
metodo_referencia = persona.presentarse
print(metodo_referencia) # Output: <bound method Persona.presentarse...>
# Podemos ejecutar la referencia después
print(metodo_referencia()) # Output: Hola, soy AnaCasos especiales importantes
Funciones que retornan funciones
def crear_saludo(saludo):
def saludar_personal(nombre):
return f"{saludo}, {nombre}!"
return saludar_personal
# Sin paréntesis - obtenemos la función interna
saludo_espanol = crear_saludo("Hola")
saludo_ingles = crear_saludo("Hello")
# Con paréntesis - ejecutamos la función interna
print(saludo_espanol("Juan")) # Output: Hola, Juan!
print(saludo_ingles("John")) # Output: Hello, John!Decoradores
def mi_decorador(funcion):
def wrapper():
print("Algo sucede antes de la función")
funcion()
print("Algo sucede después de la función")
return wrapper
@mi_decorador
def decir_hola():
print("¡Hola!")
# El decorador pasa la referencia de decir_hola a mi_decorador
# y reemplaza decir_hola con wrapper
decir_hola()Resumen clave
Con paréntesis: Ejecutas la función y obtienes su resultado
Sin paréntesis: Obtienes la referencia a la función como objeto
Esta distinción es fundamental para entender conceptos avanzados como:
Funciones de orden superior
Callbacks
Decoradores
Programación funcional
Métodos y atributos de clase
CON PARÉNTESIS = EJECUTAR
saludar() # ← EJECUTA la función, obtienes el RESULTADO
# Ejemplo: "¡Hola!"🎯 SIN PARÉNTESIS = REFERENCIAR
saludar # ← REFERENCIA la función, obtienes la FUNCIÓN misma
# Ejemplo: <function saludar at 0x...>🔍 EJEMPLO PRÁCTICO:
def saludar():
return "¡Hola!"
# CON paréntesis - EJECUTA
resultado = saludar() # ← Obtienes: "¡Hola!"
print(resultado) # → ¡Hola!
# SIN paréntesis - REFERENCIA
funcion = saludar # ← Obtienes la FUNCIÓN
print(funcion) # → <function saludar at 0x...>
# Para usar la referencia, después necesitas paréntesis:
print(funcion()) # → ¡Hola!🎪 EN NUESTRO CASO DEL CLOSURE:
def contador_llamadas(funcion_original):
def funcion_envoltura():
return funcion_original() # ← CON () para EJECUTAR
return funcion_envoltura # ← SIN () para REFERENCIAR
# ↑
# Retorna la FUNCIÓN, no su resultado🎯 RESUMEN SUPER SIMPLE:
saludar()= "Dame lo que produce" (resultado)saludar= "Dame la máquina que produce" (función)
¡Por eso el closure retorna funcion_envoltura sin paréntesis - para darte la "máquina", no lo que produce!
Comentarios
Publicar un comentario