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)) # 27partial 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)) # 10reduce()
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) # 120max() 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])) # 9Verschachtelte 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)) # Truesingledispatch
@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")) # HISchnelltest
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
- itertools: Unendliche und endliche Iteratoren
- itertools: Kombinatorik
- functools: partial und reduce
- functools: lru_cache und cached_property