Python Academy · leksjon

functools: partial og reduce

Opprett spesialiserte funksjoner med partial, og fold sekvenser med reduce.

Leksjon 3 av 413 trinn

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

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

reduce()

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

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

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

singledispatch

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

Hurtigsjekk

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.

Gratis å komme i gang

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

  1. itertools: Uendelige og endelige iteratorer
  2. itertools: Kombinatorikk
  3. functools: partial og reduce
  4. functools: lru_cache og cached_property
← Tilbake til Python Academy