functools: partial en reduce
Maak gespecialiseerde functies met partial en vouw reeksen samen met reduce.
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)) # 27partial 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)) # 10reduce()
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) # 120max() 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])) # 9Geneste 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)) # Truesingledispatch
@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")) # HIKorte 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.
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
- itertools: oneindige en eindige iterators
- itertools: combinatoriek
- functools: partial en reduce
- functools: lru_cache en cached_property