functools: partial y reduce
Cree funciones especializadas con partial y pliegue secuencias con reduce.
functools: partial y reduce es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.
Descripción general de functools
functools es un módulo de la biblioteca estándar que contiene funciones de orden superior que operan sobre otras funciones o las devuelven.
import functools
# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))partial()
functools.partial(func, *args, **kw) crea un nuevo objeto invocable con algunos argumentos ya establecidos.
import functools
def power(base, exp):
return base ** exp
square = functools.partial(power, exp=2)
cube = functools.partial(power, exp=3)
print(square(4)) # 16
print(cube(3)) # 27partial con métodos
Use partial para adaptar métodos con parámetros fijos y utilizarlos como callbacks o controladores de eventos.
import functools, logging
logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)
log_error("Something went wrong")partial frente a lambda
Se prefiere partial a lambda para establecer argumentos previamente porque se puede serializar con pickle, tiene un buen repr y conserva la cadena de documentación.
import functools
mul = lambda x, y: x * y
double_lambda = lambda x: mul(x, 2) # lambda approach
double_partial = functools.partial(mul, y=2) # partial approach
print(double_partial(5)) # 10reduce()
functools.reduce(func, iterable, initial) pliega el iterable de izquierda a derecha mediante una función binaria.
import functools, operator
total = functools.reduce(operator.add, [1,2,3,4,5])
print(total) # 15
product = functools.reduce(operator.mul, [1,2,3,4,5], 1)
print(product) # 120Construcción de max() con reduce
Ilustre reduce mediante la reimplementación de max():
import functools
def my_max(seq):
return functools.reduce(lambda a, b: a if a > b else b, seq)
print(my_max([3, 1, 4, 1, 5, 9])) # 9Aplanamiento de listas anidadas
Use reduce con operator.iconcat para aplanar un nivel de anidamiento.
import functools, operator
nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat) # [1, 2, 3, 4, 5]partial para construir URL
Un patrón práctico con partial: fije una URL base y cree funciones auxiliares especializadas para las solicitudes.
import functools, urllib.request
def fetch(base, path):
url = base.rstrip("/") + "/" + path.lstrip("/")
with urllib.request.urlopen(url) as r:
return r.read()
github = functools.partial(fetch, "https://api.github.com")
# github("/users/octocat")wraps(): conservación de metadatos
Al escribir decoradores, use @functools.wraps(wrapped) para que la función envolvente conserve el nombre y la cadena de documentación de la función original.
import functools
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
return func(*args, **kw)
return wrapper
@decorator
def greet(name):
"""Say hello."""
return f"Hello, {name}"
print(greet.__name__) # greet
print(greet.__doc__) # Say hello.total_ordering
@functools.total_ordering completa los métodos de comparación que faltan cuando define __eq__ y uno de __lt__/__le__/__gt__/__ge__.
import functools
@functools.total_ordering
class Version:
def __init__(self, major, minor):
self.v = (major, minor)
def __eq__(self, o): return self.v == o.v
def __lt__(self, o): return self.v < o.v
print(Version(1,2) >= Version(1,1)) # Truesingledispatch
@functools.singledispatch crea una función que distribuye la ejecución entre distintas implementaciones según el tipo del primer argumento.
import functools
@functools.singledispatch
def process(arg):
raise NotImplementedError(type(arg))
@process.register(int)
def _(n): return n * 2
@process.register(str)
def _(s): return s.upper()
print(process(5)) # 10
print(process("hi")) # HIComprobación rápida
¿Qué crea functools.partial(pow, 2)?
Resumen
partial establece previamente argumentos de una función; reduce pliega una secuencia con una función binaria; wraps conserva los metadatos de los decoradores; total_ordering completa los métodos de comparación; singledispatch distribuye la ejecución según el tipo.
Preguntas frecuentes
¿La lección «functools: partial y reduce» es gratis?
Sí — el texto completo de «functools: partial y reduce» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.
¿Qué aprenderé en «functools: partial y reduce»?
Cree funciones especializadas con partial y pliegue secuencias con reduce. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Python Academy?
No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «functools: partial y reduce»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Python Academy?
Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- itertools: iteradores infinitos y finitos
- itertools: combinatoria
- functools: partial y reduce
- functools: lru_cache y cached_property