Skip to content

Functools Python: Higher-Order Functions & Operations on Callable Objects

Updated on

Python, eine High-Level-Programmiersprache, ist bekannt für ihre Einfachheit und Lesbarkeit. Eine der vielen Funktionen, die Python auszeichnen, ist ihre umfangreiche Standardbibliothek, die eine Vielzahl von Modulen umfasst, um den Codierungsprozess zu vereinfachen. Unter diesen Modulen ist das functools-Modul ein leistungsstolles Werkzeug, das Higher-Order-Funktionen und Operationen auf aufrufbaren Objekten bereitstellt. Dieser Artikel wird sich mit den Funktionen des functools-Moduls beschäftigen und detaillierte Erklärungen, Definitionen und Beispiele liefern.

Das functools-Modul gehört zur Python-Standardbibliothek und soll Funktionen bereitstellen, die die Arbeit mit Higher-Order-Funktionen erleichtern. Eine Higher-Order-Funktion ist eine Funktion, die entweder eine andere Funktion als Argument annimmt oder eine Funktion zurückgibt. Diese Fähigkeit ermöglicht eine größere Flexibilität und Wiederverwendbarkeit beim Codieren und ermöglicht Entwicklern das Schreiben effizienteren und saubereren Codes.

Möchten Sie schnell Data Visualization von Python Pandas Dataframe ohne Code erstellen?

PyGWalker ist eine Python-Bibliothek für die explorative Datenanalyse mit Visualisierung. PyGWalker (opens in a new tab) kann Ihren Jupyter Notebook Datenanalyse- und Datenvisualisierungsworkflow vereinfachen, indem es Ihren Pandas-Dataframe (und polars-Dataframe) in eine Benutzeroberfläche im Tableau-Stil für visuelle Exploration umwandelt.

PyGWalker für Datenvisualisierung (opens in a new tab)

Teil 1: Das functools-Modul verstehen

Das functools-Modul in Python ist eine Sammlung von Higher-Order-Funktionen. Eine Higher-Order-Funktion ist eine Funktion, die entweder eine oder mehrere Funktionen als Argumente akzeptieren oder eine Funktion als Ergebnis zurückgeben kann. Dieses Konzept ist ein grundlegender Aspekt der funktionalen Programmierung, einem Paradigma, bei dem Funktionen Bürger erster Klasse sind und wie jeder andere Datentyp weitergegeben und verwendet werden können.

Das functools-Modul bietet mehrere Funktionen, mit denen andere Funktionen manipuliert und kombiniert werden können. Dazu gehören:

  • functools.reduce(): Diese Funktion wendet eine binäre Funktion (eine Funktion, die zwei Argumente akzeptiert) auf eine iterable kumulativ an. Wenn die Funktion beispielsweise Addition ist und das iterable eine Liste von Zahlen ist, liefert reduce() die Summe aller Zahlen in der Liste.

  • functools.partial(): Diese Funktion ermöglicht es Ihnen, eine bestimmte Anzahl von Argumenten einer Funktion zu reparieren und eine neue Funktion zu generieren. Dies kann besonders nützlich sein, wenn Sie bestimmte Argumente einer Funktion "erinnern" möchten.

  • functools.wraps(): Dies ist ein Decorator, der die Attribute der umschließenden Funktion auf die der ursprünglichen Funktion aktualisiert. Dies ist nützlich, wenn Sie Decorators verwenden, da die Metadaten der ursprünglichen Funktion erhalten bleiben.

Teil 2: Praktische Anwendungen von functools

Das functools-Modul ist nicht nur ein theoretisches Konzept, sondern hat praktische Anwendungen in realen Anwendungen. Schauen wir uns einige Beispiele an, wie Sie functools in Ihrem Python-Code verwenden können.

functools.reduce()

Die Funktion functools.reduce() ist ein leistungsstarkes Werkzeug, das verwendet werden kann, um Daten von einer iterable zu verarbeiten und zu akkumulieren. Hier ist ein Beispiel:

from functools import reduce
 
numbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x * y, numbers)
 
print(result)  # Ausgabe: 120

In diesem Beispiel nimmt reduce() zwei Argumente an: eine Funktion und eine iterable. Die Funktion ist eine Lambda-Funktion, die zwei Argumente annimmt und ihr Produkt zurückgibt. Die iterable ist eine Liste von Zahlen. reduce() wendet die Funktion kumulativ auf die Elemente der iterable an: sie wird zuerst auf die ersten beiden Elemente angewendet, dann auf das Ergebnis und das nächste Element und so weiter. Das Ergebnis ist das Produkt aller Elemente in der Liste.

functools.partial()

Die Funktion functools.partial() ermöglicht es Ihnen, eine bestimmte Anzahl von Argumenten einer Funktion zu reparieren und eine neue Funktion zu generieren. Dies kann besonders nützlich sein, wenn Sie bestimmte Argumente einer Funktion "erinnern" möchten. Hier ist ein Beispiel:

from functools import partial
 
def multiply(x, y):
    return x * y
 
# Erstellen Sie eine neue Funktion, die mit 2 multipliziert
double = partial(multiply, 2)
 
print(double(4))  # Ausgabe: 8

In diesem Beispiel wird partial() verwendet, um eine neue Funktion double() zu erstellen, die ihr Argument mit 2 multipliziert. Dies wird erreicht, indem das erste Argument der Funktion multiply() auf 2 festgelegt wird.

functools.wraps()

Die Funktion functools.wraps() ist ein Decorator, der anzeigt, dass eine Funktion eine andere Funktion umgibt. Dies ist nützlich, wenn Sie Decorators verwenden, da die Metadaten der ursprünglichen Funktion erhalten bleiben. Hier ist ein Beispiel:

from functools import wraps
 
def my_decorator(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print("Vor dem Aufruf der Funktion")
        result = f(*args, **kwargs)
        print("Nach dem Aufruf der Funktion")
        return result
    return wrapper
 
@my_decorator
def add(x, y):
    """Addiert zwei Zahlen"""
    return x + y
 
print(add.__name__)  # Ausgabe: add
print(add.__doc__)   # Ausgabe: Addiert zwei Zahlen

In diesem Beispiel wird wraps() in der Definition eines Decorators my_decorator() verwendet. Der Decorator fügt vor und nach dem Aufruf der Funktion (der dekorierten Funktion) bestimmtes Verhalten (Drucken von Nachrichten) hinzu. Durch die Verwendung von wraps() bleiben die Metadaten der ursprünglichen Funktion (ihr Name und ihre Docstring) erhalten.

Teil 3: functools vs itertools

Die Python-Standardbibliothek enthält auch ein weiteres Modul zum Umgang mit Operationen auf Iterables: itertools. Während functools höherwertige Funktionen und Operationen auf aufrufbare Objekte bietet, stellt itertools eine Reihe von Tools zum Erstellen von Iteratoren bereit. Diese können für effizientes Durchlaufen, Generieren von Permutationen und Kombinationen sowie andere Datentransformationsaufgaben verwendet werden.

Die Module functools und itertools ergänzen sich und können oft zusammen verwendet werden. Zum Beispiel können Sie itertools.cycle() verwenden, um einen unendlichen Iterator zu erstellen, und functools.partial() verwenden, um eine Funktion zu erstellen, die eine endliche Anzahl von Elementen aus diesem Iterator generiert.

Zusammenfassend ist das Modul functools ein leistungsstarkes Tool in der Python-Standardbibliothek, das eine Reihe von höherwertigen Funktionen und Operationen auf aufrufbaren Objekten bietet. Durch das Verständnis und die Verwendung von functools können Sie effizienteren und saubereren Python-Code schreiben. Egal, ob Sie ein Anfänger sind, der gerade mit Python anfängt, oder ein erfahrener Entwickler, der seine Fähigkeiten verbessern möchte, functools ist ein Modul, das es sich lohnt zu erkunden.

Teil 4: Neue Funktionen in functools Python 3.10

Python 3.10 hat dem functools-Modul einige neue Funktionen hinzugefügt, um seine Fähigkeiten zu verbessern und es noch leistungsfähiger zu machen.

Eine der neuen Funktionen ist die Funktion functools.cache(). Diese Funktion ist ein simplerer und effizienterer Ersatz für functools.lru_cache(). Sie erstellt einen Cache, der die Ergebnisse von Funktionsaufrufen speichert. Wenn die Funktion erneut mit denselben Argumenten aufgerufen wird, können die Ergebnisse aus dem Cache anstatt sie neu zu berechnen zurückgegeben werden. Dadurch kann die Ausführung von Funktionen, die wiederholt mit denselben Argumenten aufgerufen werden, erheblich beschleunigt werden.

Hier ein Beispiel zur Verwendung von functools.cache():

from functools import cache
 
@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)
 
print(fibonacci(10))  # Ausgabe: 55

In diesem Beispiel wird cache() als Decorator für die Funktion fibonacci() verwendet. Diese Funktion berechnet die n-te Fibonacci-Zahl und wird rekursiv aufgerufen. Durch die Verwendung von cache() werden die Ergebnisse früherer Aufrufe gespeichert, so dass sie in späteren Aufrufen wiederverwendet werden können. Dadurch wird die Berechnung von Fibonacci-Zahlen erheblich beschleunigt.

Teil 5: functools in realen Anwendungen

Das functools-Modul ist nicht nur ein theoretisches Konzept, sondern es hat praktische Anwendungen in realen Anwendungen. Es wird in verschiedenen Bereichen eingesetzt, von Datenwissenschaft und maschinellem Lernen über Webentwicklung und Automatisierung.

In der Datenwissenschaft und im maschinellen Lernen kann functools verwendet werden, um komplexe Datenverarbeitungspipelines zu erstellen. Zum Beispiel können Sie functools.partial() verwenden, um Funktionen zu erstellen, die Daten auf eine bestimmte Weise vorverarbeiten, und diese Funktionen dann mit functools.reduce() kombinieren, um eine Pipeline zu erstellen, die Daten in mehreren Schritten verarbeitet.

In der Webentwicklung kann functools verwendet werden, um Middleware und Decorators zu erstellen. Zum Beispiel können Sie functools.wraps() verwenden, um Decorators zu erstellen, die Verhalten zu Webanfragen-Handlern hinzufügen, wie z.B. Authentifizierung und Protokollierung.

In der Automatisierung kann functools verwendet werden, um Aufgaben zu erstellen, die aus mehreren Schritten bestehen. Zum Beispiel können Sie functools.partial() verwenden, um Aufgaben zu erstellen, die eine bestimmte Aktion mit einem bestimmten Satz von Parametern ausführen, und dann functools.reduce() verwenden, um diese Aufgaben in einen Workflow zu kombinieren.

Fazit

Zusammenfassend ist das functools-Modul ein leistungsstarkes Tool in der Python-Standardbibliothek, das eine Reihe von höherwertigen Funktionen und Operationen auf aufrufbaren Objekten bietet. Durch das Verständnis und die Verwendung von functools können Sie effizienteren und saubereren Python-Code schreiben. Egal, ob Sie ein Anfänger sind, der gerade mit Python anfängt, oder ein erfahrener Entwickler, der seine Fähigkeiten verbessern möchte, functools ist ein Modul, das es sich lohnt zu erkunden.


FAQs

Was ist das functools-Modul in Python?

Das functools-Modul ist Teil der Python-Standardbibliothek und bietet höherwertige Funktionen und Operationen auf aufrufbaren Objekten. Es enthält Funktionen wie reduce(), partial() und wraps(), die verwendet werden können, um andere Funktionen zu manipulieren und zu kombinieren.

Wie funktioniert die partial()-Funktion im functools-Modul von Python?

Die partial()-Funktion im functools-Modul von Python ermöglicht es Ihnen, eine bestimmte Anzahl von Argumenten einer Funktion festzulegen und eine neue Funktion zu generieren. Dies kann besonders nützlich sein, wenn Sie bestimmte Argumente einer Funktion "erinnern" möchten.

Was ist der Zweck der wraps()-Funktion im functools-Modul von Python?

Die wraps()-Funktion im functools-Modul von Python ist ein Decorator, der anzeigt, dass eine Funktion eine andere Funktion umschließt. Dies ist nützlich, wenn Sie Decorators verwenden, da so die Metadaten der ursprünglichen Funktion erhalten bleiben.