Geschichte der Frage
Die Funktion map() existiert in Python seit den frühesten Versionen als Spiegelbild der funktionalen Programmierung. Sie wird verwendet, um eine Funktion auf jedes Element eines iterierbaren Objekts anzuwenden.
Problem
Nicht alle angehenden Entwickler verstehen den Unterschied zwischen map, Generatoren und Listenkomprehension. Es entstehen Fragen zur Leistung, Lesbarkeit und Kompatibilität mit der faulen Datenverarbeitung.
Lösung
Die Funktion map() nimmt eine Funktion und ein oder mehrere iterierbare Objekte an, wobei sie einen faulen Iterator zurückgibt, auf den nacheinander die Funktion auf jedes Element angewendet wird. Dies ist speichereffizient und ermöglicht die Verarbeitung großer Datenmengen, ohne Zwischenspeicherlisten zu erstellen.
Beispielcode:
# Rückgabe der Quadrate von Zahlen über map zahlen = [1, 2, 3, 4] quadrate = map(lambda x: x**2, zahlen) print(list(quadrate)) # [1, 4, 9, 16]
Schlüsselfunktionen:
Kann die Funktion map() mit zwei oder mehr Sequenzen gleichzeitig arbeiten? Wie macht man das?
Ja, man kann mehrere Sequenzen übergeben, wenn die Funktion genauso viele Argumente annimmt. Die Iteration endet, sobald das kürzeste iterierbare Objekt endet.
Beispielcode:
a = [1, 2, 3] b = [4, 5, 6] res = list(map(lambda x, y: x + y, a, b)) print(res) # [5, 7, 9]
Was gibt map() zurück, wenn man eine Funktion übergibt, die None zurückgibt?
Jedes Element von map wird None sein. Wenn die Funktion keine Werte explizit zurückgibt, ist das Ergebnis immer eine Liste von None:
def print_val(x): print(x) # kein return list(map(print_val, [1,2,3])) # [None, None, None] und drei Ausgaben in der Konsole
Was ist der Unterschied zwischen map() und Listenkomprehension bezüglich des Speicherverbrauchs?
map erstellt nicht das gesamte Ergebnis sofort im Speicher, sondern berechnet auf Anfrage; Listenkomprehension [...] erstellt die vollständige Liste. Bei großen Datenmengen ist die Verwendung von map vorzuziehen, wenn nicht das gesamte Ergebnis sofort benötigt wird.
Im Projekt wurde map verwendet, um eine Liste mit einer Funktion zu durchlaufen, die in eine Datei schreibt, aber man vergaß, einen Rückgabewert zu implementieren. Man erwartete Daten, aber map gab einen Iterator mit None zurück.
Vorteile:
Nachteile:
Verwendung von map zur Verarbeitung und Filterung einer großen Liste von Protokollen, indem eine reine Funktion geschrieben wurde, die ein Ergebnis zurückgibt. Der map-Iterator gab nacheinander Werte zur Speicherung in eine Datei ohne Überlauf des Speichers zurück.
Vorteile:
Nachteile: