functools: partial og reduce
Opprett spesialiserte funksjoner med partial, og fold sekvenser med reduce.
functools: partial og reduce er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.
Oversikt over functools
functools er en modul i standardbiblioteket med høyereordensfunksjoner som opererer på eller returnerer andre funksjoner.
import functools
# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))partial()
functools.partial(func, *args, **kw) oppretter et nytt kallbart objekt med noen argumenter forhåndsutfylt.
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 med metoder
Bruk partial til å tilpasse metoder med faste parametere, slik at de kan brukes som tilbakekall eller hendelsesbehandlere.
import functools, logging
logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)
log_error("Something went wrong")partial kontra lambda
partial foretrekkes fremfor lambda for å forhåndsutfylle argumenter fordi den kan serialiseres med pickle, har en god repr og bevarer dokumentasjonsstrengen.
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) folder den itererbare verdien fra venstre mot høyre ved hjelp av en binær funksjon.
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) # 120Bygge max() med reduce
Illustrer reduce ved å implementere max() på nytt:
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])) # 9Flate ut nøstede lister
Bruk reduce med operator.iconcat til å flate ut ett nivå med nøsting.
import functools, operator
nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat) # [1, 2, 3, 4, 5]partial for å bygge URL-er
Et praktisk partial-mønster: fastsett en basis-URL og opprett spesialiserte hjelpefunksjoner for forespørsler.
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(): Bevare metadata
Når De skriver dekoratorer, bør De bruke @functools.wraps(wrapped) slik at omslagsfunksjonen bevarer navnet og dokumentasjonsstrengen til den opprinnelige funksjonen.
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 fyller ut manglende sammenligningsmetoder når De definerer __eq__ og én av __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 oppretter en funksjon som velger mellom ulike implementasjoner basert på typen til det første argumentet.
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")) # HIHurtigsjekk
Hva oppretter functools.partial(pow, 2)?
Oppsummering
partial forhåndsutfyller funksjonsargumenter; reduce folder en sekvens med en binær funksjon; wraps bevarer dekoratormetadata; total_ordering fyller ut sammenligningsmetoder; singledispatch velger implementasjon basert på type.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 76
- Leksjoner
- 320
Ofte stilte spørsmål
Er leksjonen «functools: partial og reduce» gratis?
Ja – hele teksten i «functools: partial og reduce» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «functools: partial og reduce»?
Opprett spesialiserte funksjoner med partial, og fold sekvenser med reduce. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Python Academy?
Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «functools: partial og reduce»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?
Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- itertools: Uendelige og endelige iteratorer
- itertools: Kombinatorikk
- functools: partial og reduce
- functools: lru_cache og cached_property