0Pricing
Python Academy · Lektion

functools: partial und reduce

Erstellen Sie mit partial spezialisierte Funktionen und falten Sie Sequenzen mit reduce.

functools: partial und reduce ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Überblick über functools

functools ist ein Modul der Standardbibliothek mit Funktionen höherer Ordnung, die andere Funktionen verarbeiten oder zurückgeben.

import functools

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

partial()

functools.partial(func, *args, **kw) erstellt ein neues aufrufbares Objekt, bei dem einige Argumente bereits vorbelegt sind.

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 mit Methoden

Verwenden Sie partial, um Methoden mit festen Parametern für den Einsatz als Callbacks oder Event-Handler anzupassen.

import functools, logging

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

log_error("Something went wrong")

partial vs lambda

partial wird zum Vorbelegen von Argumenten gegenüber lambda bevorzugt, weil es mit pickle serialisierbar ist, eine aussagekräftige repr liefert und den Docstring bewahrt.

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) reduziert das Iterable von links nach rechts mithilfe einer binären Funktion.

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() mit reduce erstellen

Veranschaulichen Sie reduce, indem Sie max() neu implementieren:

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

Verschachtelte Listen abflachen

Verwenden Sie reduce zusammen mit operator.iconcat, um eine Verschachtelungsebene abzuflachen.

import functools, operator

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

partial zum Erstellen von URLs

Ein praktisches partial-Muster: Legen Sie eine Basis-URL fest und erstellen Sie spezialisierte Request-Hilfsfunktionen.

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(): Metadaten bewahren

Verwenden Sie beim Schreiben von Decorators @functools.wraps(wrapped), damit der Wrapper den Namen und den Docstring der ursprünglichen Funktion bewahrt.

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 ergänzt fehlende Vergleichsmethoden, wenn Sie __eq__ und eine der Methoden __lt__/__le__/__gt__/__ge__ definieren.

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 erstellt eine Funktion, die abhängig vom Typ des ersten Arguments unterschiedliche Implementierungen aufruft.

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

Schnelltest

Was erstellt functools.partial(pow, 2)?

Zusammenfassung

partial belegt Funktionsargumente vor; reduce reduziert eine Sequenz mit einer binären Funktion; wraps bewahrt Decorator-Metadaten; total_ordering ergänzt Vergleichsmethoden; singledispatch ruft Implementierungen abhängig vom Typ auf.

Häufig gestellte Fragen

Ist die Lektion „functools: partial und reduce“ kostenlos?

Ja — der vollständige Text von „functools: partial und reduce“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „functools: partial und reduce“?

Erstellen Sie mit partial spezialisierte Funktionen und falten Sie Sequenzen mit reduce. Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Python Academy zu starten?

Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „functools: partial und reduce“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?

Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. itertools: Unendliche und endliche Iteratoren
  2. itertools: Kombinatorik
  3. functools: partial und reduce
  4. functools: lru_cache und cached_property
← Zurück zu Python Academy