Python Academy · Les

functools: partial en reduce

Maak gespecialiseerde functies met partial en vouw reeksen samen met reduce.

Les 3 van 413 stappen

functools: partial en reduce is een gratis Python Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.

Overzicht van functools

functools is een module uit de standaardbibliotheek met functies van hogere orde die andere functies bewerken of teruggeven.

import functools

# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))

partial()

functools.partial(func, *args, **kw) maakt een nieuw aanroepbaar object met enkele vooraf ingevulde argumenten.

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 met methoden

Gebruik partial om methoden met vaste parameters geschikt te maken voor gebruik als callbacks of gebeurtenisafhandelaars.

import functools, logging

logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)

log_error("Something went wrong")

partial versus lambda

partial heeft de voorkeur boven lambda om argumenten vooraf in te vullen, omdat het kan worden gepickled, een goede repr heeft en de documentatiestring behoudt.

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) vouwt het itereerbare object van links naar rechts samen met een binaire functie.

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

max() bouwen met reduce

Demonstreer reduce door max() opnieuw te implementeren:

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

Geneste lijsten afvlakken

Gebruik reduce met operator.iconcat om één niveau van nesten af te vlakken.

import functools, operator

nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat)  # [1, 2, 3, 4, 5]

partial voor URL's opbouwen

Een praktisch patroon met partial: leg een basis-URL vast en maak gespecialiseerde hulpfuncties voor aanvragen.

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(): metagegevens behouden

Gebruik bij het schrijven van decoratoren @functools.wraps(wrapped), zodat de wrapper de naam en documentatiestring van de oorspronkelijke functie behoudt.

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 vult ontbrekende vergelijkingsmethoden aan wanneer je __eq__ en een van __lt__/__le__/__gt__/__ge__ definieert.

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 maakt een functie die op basis van het type van het eerste argument naar verschillende implementaties doorstuurt.

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

Korte controle

Wat maakt functools.partial(pow, 2) aan?

Samenvatting

partial vult functieargumenten vooraf in; reduce vouwt een reeks samen met een binaire functie; wraps behoudt metagegevens van decoratoren; total_ordering vult vergelijkingsmethoden aan; singledispatch stuurt door op basis van type.

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
76
Lessen
320

Veelgestelde vragen

Is de les “functools: partial en reduce” gratis?

Ja — de volledige tekst van “functools: partial en reduce” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.

Wat leer ik in “functools: partial en reduce”?

Maak gespecialiseerde functies met partial en vouw reeksen samen met reduce. Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Python Academy te beginnen?

Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “functools: partial en reduce”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Python Academy?

Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. itertools: oneindige en eindige iterators
  2. itertools: combinatoriek
  3. functools: partial en reduce
  4. functools: lru_cache en cached_property
← Terug naar Python Academy