Python Functools iTertools: 7 Super Handy Tools für intelligentere Code
Bild von Autor | Ideogramm

Die Standardbibliothek von Python verfügt über mehrere Dienstprogramme, die Ihren Code von Clunky und VERBOSE zu Elegant und effizient umwandeln können. Unter diesen sind die Functools und Itertools-Module für nicht triviale Aufgaben häufig tremendous praktisch.

Heute werden wir uns sieben wichtige Werkzeuge – Funktionen und Dekorateure – aus diesen Modulen ansehen, die Ihren Python -Code verbessern.

Fangen wir an.

🔗 Hyperlink zum Code auf GitHub

1. functools.lru_cache

Sie können die verwenden @lru_cache Dekorateur zur Cache -Funktionsergebnisse und um zu vermeiden, teure Vorgänge zu wiederholen.

Hier ist ein Beispiel:

from functools import lru_cache

@lru_cache(maxsize=128)
def fetch_user_data(user_id):
    # Costly database name
    return database.get_user(user_id)

# First name hits database, subsequent calls use cache
person = fetch_user_data(123)  # Database name
person = fetch_user_data(123)  # Returns cached outcome

Wie es funktioniert: die @lru_cache Dekorateur speichert in Erinnerung. Wann fetch_user_data(123) Es wird erneut aufgerufen, es gibt das zwischengespeicherte Ergebnis zurück, anstatt die Datenbank zu treffen. maxsize=128 Hält die 128 jüngsten Ergebnisse.

2. itertools.chain

Um mehrere iterable als ein kontinuierlicher Strom zu verarbeiten, können Sie verwenden chain.from_iterable() Aus dem iTertools -Modul.

Nehmen wir ein Beispiel:

from itertools import chain

# Course of a number of log information as one stream
error_logs = ('app.log', 'db.log', 'api.log')
all_lines = chain.from_iterable(open(f) for f in error_logs)

error_count = sum(1 for line in all_lines if 'ERROR' in line)

Wie es funktioniert: chain.from_iterable() Nimmt mehrere iterable und erstellt einen kontinuierlichen Strom. Es liest jeweils eine Zeile.

3. functools.partial

Teilfunktionen in Python sind tremendous hilfreich, wenn Sie spezielle Funktionen von Funktionen erstellen müssen. Das heißt, Sie möchten Versionen der Funktion erstellen, mit einigen bereits festgelegten Argumenten partial Aus dem Functools -Modul.

Hier ist ein Beispiel für eine Teilfunktion:

from functools import partial
import logging

def log_event(degree, element, message):
    logging.log(degree, f"({element}) {message}")

# Create specialised loggers
auth_error = partial(log_event, logging.ERROR, 'AUTH')
db_info = partial(log_event, logging.INFO, 'DATABASE')

# Clear utilization
auth_error("Login failed for person")
db_info("Connection established")

Wie es funktioniert: partial Erstellt eine neue Funktion mit einigen vorgefüllten Argumenten. Im Beispiel, auth_error ist im Wesentlichen log_event Wenn Stage und Komponenten bereits festgelegt sind, müssen Sie nur die Nachricht bereitstellen.

4. itertools.combos

Wenn Sie alle möglichen Kombinationen von Elementen zum Testen oder Optimieren generieren müssen, können Sie verwenden combos Aus dem iTertools -Modul.

Betrachten Sie das folgende Beispiel:

from itertools import combos

options = ('cache', 'compression', 'cdn')

# Take a look at all pairs of options
for combo in combos(options, 2):
    efficiency = test_feature_combo(combo)
    print(f"{combo}: {efficiency}ms")

Wie es funktioniert: combos(options, 2) generiert alle möglichen Paare aus der Liste. Es erstellt Kombinationen on-demand, ohne sie alle im Speicher zu speichern, sodass es für große Datensätze effizient ist.

5. functools.singledispatch

Der @singledispatch Dekorateur aus dem Functools -Modul kann Ihnen helfen, Funktionen zu erstellen, die auf der Grundlage des Eingangstyps unterschiedlich wirken.

Schauen Sie sich den folgenden Code -Snippet an:

from functools import singledispatch
from datetime import datetime

@singledispatch
def format_data(worth):
    return str(worth)  # Default

@format_data.register(datetime)
def _(worth):
    return worth.strftime("%Y-%m-%d")

@format_data.register(checklist)
def _(worth):
    return ", ".be part of(str(merchandise) for merchandise in worth)

# Robotically picks the correct formatter
print(format_data(datetime.now()))  # this outputs "2025-06-27"
print(format_data((1, 2, 3)))       # this outputs "1, 2, 3"

Wie es funktioniert: Python überprüft den Typ des ersten Arguments und ruft die entsprechende registrierte Funktion auf. Es wird jedoch den Normal verwendet @singledispatch Funktion, wenn kein spezifischer Handler existiert.

6. itertools.groupby

Sie können aufeinanderfolgende Elemente gruppieren, die dieselbe Eigenschaft mithilfe der gleichen Eigenschaften teilen groupby Funktion von iTertools.

Betrachten Sie dieses Beispiel:

from itertools import groupby

transactions = (
    {'kind': 'credit score', 'quantity': 100},
    {'kind': 'credit score', 'quantity': 50},
    {'kind': 'debit', 'quantity': 75},
    {'kind': 'debit', 'quantity': 25}
)

# Group by transaction kind
for trans_type, group in groupby(transactions, key=lambda x: x('kind')):
    complete = sum(merchandise('quantity') for merchandise in group)
    print(f"{trans_type}: ${complete}")

Wie es funktioniert: groupby Gruppen aufeinanderfolgenden Elementen mit demselben Schlüssel. Es gibt Paare von zurück (key, group_iterator). WICHTIG: Es gruppiert nur benachbarte Elemente. Sortieren Sie daher Ihre Daten bei Bedarf zuerst.

7. functools.cut back

Sie können die verwenden cut back Funktion aus dem Functools -Modul, um eine Funktion kumulativ auf alle Elemente in einem iterablen anzuwenden, um einen einzelnen Wert zu erhalten.

Nehmen Sie das folgende Beispiel:

from functools import cut back

# Calculate compound curiosity
monthly_rates = (1.01, 1.02, 0.99, 1.015)  # Month-to-month development charges

final_amount = cut back(lambda complete, price: complete * price, monthly_rates, 1000)
print(f"Closing quantity: ${final_amount:.2f}")

Wie es funktioniert: cut back Nimmt eine Funktion und wendet sie Schritt für Schritt an: zuerst zum Anfangswert (1000) und den ersten Fee, dann auf dieses Ergebnis und den zweiten Fee usw. Es funktioniert intestine für Operationen, die Staat aufbauen.

Einpacken

Zusammenfassend haben wir gesehen, wie Sie verwenden können:

  • @lru_cache Wenn Sie Funktionen haben, die oft mit den gleichen Argumenten bezeichnet werden
  • itertools.chain Wenn Sie mehrere Datenquellen als ein kontinuierlicher Stream verarbeiten müssen
  • functools.partial Erstellen von spezialisierten Versionen generischer Funktionen
  • itertools.combos zur systematischen Erforschung von Möglichkeiten
  • @singledispatch Wenn Sie typenbasiertes Funktionsverhalten benötigen
  • groupby für effiziente aufeinanderfolgende Gruppierungsoperationen
  • cut back Für komplexe Aggregationen, die Staat aufbauen

Wenn Sie das nächste Mal ausführliche Schleifen oder wiederholte Code schreiben, pausieren Sie eine Pause und überlegen Sie, ob eine davon eine elegantere Lösung darstellt.

Dies sind nur eine Handvoll Werkzeuge, die ich für hilfreich finde. Es gibt noch viel mehr, wenn Sie sich die Python Normal Library genauer ansehen. Additionally ja, glücklich zu erkunden!

Bala Priya c ist ein Entwickler und technischer Schriftsteller aus Indien. Sie arbeitet gern an der Schnittstelle zwischen Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Ihre Interessensgebiete und Fachgebiete umfassen DevOps, Information Science und natürliche Sprachverarbeitung. Sie liest gerne, schreibt, codieren und Kaffee! Derzeit arbeitet sie daran, ihr Wissen mit der Entwicklergemeinschaft zu lernen und zu teilen, indem sie Tutorials, Anleitungen, Meinungsstücke und vieles mehr autorisiert. Bala erstellt auch ansprechende Ressourcenübersichten und Codierungs -Tutorials.



Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert