348 Stimmen

Verstehen der Kartenfunktion

In der Python 2 Dokumentation steht:

Eingebaute Funktionen: map(function, iterable, ...)

Wendet die Funktion auf jedes Element von iterable an und gibt eine Liste der Ergebnisse zurück. Wenn zusätzliche iterable-Argumente übergeben werden, muss die Funktion so viele Argumente annehmen und wird auf die Elemente aus allen Iterablen parallel angewendet.

Wenn eine Iterable kürzer als eine andere ist, wird angenommen, dass sie verlängert ist mit None-Elementen erweitert.

Wenn die Funktion None wird die Identitätsfunktion angenommen; wenn es mehrere Argumente, map() gibt eine Liste zurück, die aus Tupeln besteht die die entsprechenden Elemente aus allen Iterablen enthalten (eine Art Transponierungsoperation).

Die iterierbaren Argumente können eine Sequenz oder ein beliebiges iterierbares Objekt sein; das Ergebnis ist immer eine Liste.

Welche Rolle spielt dies bei der Herstellung eines kartesischen Produkts?

content = map(tuple, array)

Welche Auswirkungen hat es, wenn man ein Tupel irgendwo einfügt? Mir ist auch aufgefallen, dass die Ausgabe ohne die Map-Funktion wie folgt aussieht abc und damit ist es a, b, c .

Ich möchte diese Funktion vollständig verstehen. Die Referenzdefinitionen sind ebenfalls schwer zu verstehen. Zu viel Schnickschnack.

10voto

Ranga Punkte 613

Python3 - map(func, iterable)

Eine Sache, die nicht vollständig erwähnt wurde (obwohl @BlooB es irgendwie erwähnt hat) ist, dass map ein map-Objekt zurückgibt NICHT eine Liste. Dies ist ein großer Unterschied, wenn es um die Zeitleistung bei Initialisierung und Iteration geht. Betrachten Sie diese beiden Tests.

import time
def test1(iterable):
    a = time.clock()
    map(str, iterable)
    a = time.clock() - a

    b = time.clock()
    [ str(x) for x in iterable ]
    b = time.clock() - b

    print(a,b)

def test2(iterable):
    a = time.clock()
    [ x for x in map(str, iterable)]
    a = time.clock() - a

    b = time.clock()
    [ str(x) for x in iterable ]
    b = time.clock() - b

    print(a,b)

test1(range(2000000))  # Prints ~1.7e-5s   ~8s
test2(range(2000000))  # Prints ~9s        ~8s

Wie Sie sehen können, nimmt die Initialisierung der Kartenfunktion fast keine Zeit in Anspruch. Die Iteration durch das map-Objekt dauert jedoch länger als die einfache Iteration durch die Iterable. Dies bedeutet, dass die an map() übergebene Funktion nicht auf jedes Element angewendet wird, bis das Element in der Iteration erreicht wird. Wenn Sie eine Liste wollen, verwenden Sie List Comprehension. Wenn Sie vorhaben, in einer for-Schleife zu iterieren und an einem bestimmten Punkt abzubrechen, verwenden Sie map.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X