0Pricing
Python Academy · Lección

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))    # 27

partial 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))   # 10

reduce()

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) # 120

Construcció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]))  # 9

Aplanamiento 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))  # True

singledispatch

@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"))  # HI

Comprobació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

  1. itertools: iteradores infinitos y finitos
  2. itertools: combinatoria
  3. functools: partial y reduce
  4. functools: lru_cache y cached_property
← Volver a Python Academy