Python: Programación Funcional
Descubre la programación funcional en Python con conceptos, funciones puras, lambdas, decoradores y generadores para código limpio y eficiente.
Aprende Python GRATIS y certifícateProgramación Funcional en Python
La programación funcional representa un paradigma de programación que trata la computación como la evaluación de funciones matemáticas, evitando el cambio de estado y los datos mutables. En Python, este enfoque se combina naturalmente con las características imperativas y orientadas a objetos del lenguaje, ofreciendo herramientas que permiten escribir código más limpio, predecible y fácil de mantener.
A diferencia de la programación imperativa, donde describimos cómo hacer algo paso a paso, la programación funcional se centra en qué queremos obtener. Este cambio de perspectiva resulta especialmente útil para el procesamiento de datos, transformaciones complejas y operaciones que requieren alta confiabilidad.
Principios fundamentales
Los conceptos centrales de la programación funcional incluyen la inmutabilidad, las funciones puras y la composición de funciones. Una función pura siempre produce el mismo resultado para los mismos argumentos y no genera efectos secundarios, lo que facilita el testing y la depuración.
# Función pura - siempre devuelve el mismo resultado
def calcular_area_circulo(radio):
return 3.14159 * radio ** 2
# Función impura - depende de estado externo
contador = 0
def incrementar():
global contador
contador += 1
return contador
La inmutabilidad significa que los datos no cambian después de su creación. Python ofrece estructuras inmutables como tuplas, strings y frozensets, que son fundamentales en este paradigma.
Funciones como ciudadanos de primera clase
En Python, las funciones son objetos que pueden asignarse a variables, pasarse como argumentos y devolverse desde otras funciones. Esta característica habilita patrones funcionales avanzados.
# Asignar función a variable
operacion = len
resultado = operacion("Python") # 6
# Función que devuelve otra función
def crear_multiplicador(factor):
def multiplicar(numero):
return numero * factor
return multiplicar
doble = crear_multiplicador(2)
print(doble(5)) # 10
Las funciones de orden superior reciben otras funciones como parámetros o las devuelven como resultado. Este concepto permite crear abstracciones potentes y reutilizables.
Funciones lambda y expresiones
Las expresiones lambda proporcionan una sintaxis concisa para crear funciones anónimas de una sola línea. Son especialmente útiles con funciones como map()
, filter()
y reduce()
.
# Lambda básica
cuadrado = lambda x: x ** 2
print(cuadrado(4)) # 16
# Lambda con múltiples argumentos
suma = lambda a, b: a + b
print(suma(3, 7)) # 10
# Lambda en contexto funcional
numeros = [1, 2, 3, 4, 5]
pares = list(filter(lambda x: x % 2 == 0, numeros))
print(pares) # [2, 4]
Funciones integradas para programación funcional
Python incluye funciones integradas que implementan operaciones funcionales comunes. La función map()
aplica una función a cada elemento de un iterable, transformando los datos de manera declarativa.
# Transformar lista de temperaturas de Celsius a Fahrenheit
celsius = [0, 20, 30, 40]
fahrenheit = list(map(lambda c: c * 9/5 + 32, celsius))
print(fahrenheit) # [32.0, 68.0, 86.0, 104.0]
La función filter()
selecciona elementos que cumplen una condición específica, mientras que reduce()
del módulo functools
combina elementos secuencialmente.
from functools import reduce
# Filtrar números positivos
numeros = [-2, -1, 0, 1, 2, 3]
positivos = list(filter(lambda x: x > 0, numeros))
print(positivos) # [1, 2, 3]
# Calcular producto de una lista
producto = reduce(lambda x, y: x * y, [1, 2, 3, 4])
print(producto) # 24
Comprensiones como alternativa funcional
Las comprensiones de listas ofrecen una sintaxis pythónica para operaciones funcionales, combinando transformación y filtrado en una expresión legible.
# Comprensión equivalente a map + filter
numeros = range(10)
cuadrados_pares = [x**2 for x in numeros if x % 2 == 0]
print(cuadrados_pares) # [0, 4, 16, 36, 64]
# Comprensión de diccionario
palabras = ['python', 'java', 'go']
longitudes = {palabra: len(palabra) for palabra in palabras}
print(longitudes) # {'python': 6, 'java': 4, 'go': 2}
Decoradores y programación funcional
Los decoradores representan un patrón funcional que modifica o extiende el comportamiento de funciones sin alterar su código. Utilizan el concepto de funciones de orden superior para crear abstracciones elegantes.
def medir_tiempo(func):
import time
def wrapper(*args, **kwargs):
inicio = time.time()
resultado = func(*args, **kwargs)
fin = time.time()
print(f"{func.__name__} tardó {fin - inicio:.4f} segundos")
return resultado
return wrapper
@medir_tiempo
def operacion_lenta():
import time
time.sleep(1)
return "Completado"
Iteradores y generadores
Los generadores implementan evaluación perezosa, calculando valores bajo demanda en lugar de crear estructuras completas en memoria. Esta característica es fundamental para el procesamiento eficiente de grandes conjuntos de datos.
# Generador para secuencia de Fibonacci
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# Usar solo los primeros 10 números
fib = fibonacci()
primeros_diez = [next(fib) for _ in range(10)]
print(primeros_diez) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
La programación funcional en Python no requiere abandonar completamente otros paradigmas, sino incorporar sus principios donde aporten valor. Esta flexibilidad permite escribir código más expresivo, mantenible y eficiente, especialmente en tareas de procesamiento de datos y transformaciones complejas.
Lecciones de este módulo de Python
Lecciones de programación del módulo Programación Funcional del curso de Python.
Ejercicios de programación en este módulo de Python
Evalúa tus conocimientos en Programación Funcional con ejercicios de programación Programación Funcional de tipo Test, Puzzle, Código y Proyecto con VSCode.