2013-09-22 13 views
19

Ich lese durch die Python-Dokumentation, um wirklich in die Python-Sprache einzutauchen und stieß auf die Filter- und Kartenfunktionen. Ich habe vorher Filter benutzt, aber nie mapped, obwohl ich beide in verschiedenen Python-Fragen hier auf SO gesehen habe.Python: Unterschied zwischen Filter (Funktion, Sequenz) und Karte (Funktion, Sequenz)

Nach dem Lesen über sie im Python-Tutorial bin ich verwirrt über den Unterschied zwischen den beiden. Zum Beispiel von 5.1.3. Functional Programming Tools:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
... 
>>> filter(f, range(2, 25)) 
[5, 7, 11, 13, 17, 19, 23] 

und

>>> def cube(x): return x*x*x 
... 
>>> map(cube, range(1, 11)) 
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] 

sahen diese fast genau die gleiche Funktion wie mir, also ging ich in der Klemme Python interaktiv laufen und getestet meinen eigenen Fall aus. Ich habe map sowohl für die erste als auch die zweite Instanz oben verwendet, und für die erste (return x % 2 != 0 and x % 3 != 0) gab es eine Liste von Booleschen statt Zahlen zurück.

Warum gibt map manchmal einen booleschen Wert und manchmal den tatsächlichen Rückgabewert zurück?

Kann mir jemand genau den Unterschied zwischen map und filter erklären?

Antwort

24
map(cube, range(1, 11)) 

entspricht

[cube(1), cube(2), ..., cube(10)] 

Während die Liste zu result

Äquivalent von

filter(f, range(2, 25)) 

zurückgegeben

result = [] 
for i in range(2, 25): 
    if f(i): 
     result.append(i) 

Hinweis nach der Ausführung, dass, wenn unter Verwendung map sind die Elemente im Ergebnis Werte, die von der Funktion cube zurückgegeben werden.

Im Gegensatz dazu sind die von f in filter(f, ...) zurückgegebenen Werte nicht die Elemente in result. f(i) wird nur verwendet, um zu bestimmen, wenn der Wert i in result gehalten werden sollte.

12

filter(), wie der Name andeutet, filtert das ursprüngliche iterable und gibt die Elemente zurück, die True für die Funktion filter() zurückgeben.

map() die angewandte Funktion auf jedes Element des Iterablen anwenden und eine Liste der Ergebnisse für jedes Element zurückgeben.

Folgt dem Beispiel, das Sie gab, lassen Sie uns sie vergleichen:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
>>> range(11) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> map(f, range(11)) #the ones that returns TRUE are 1, 5 and 7 
[False, True, False, False, False, True, False, True, False, False, False] 
>>> filter(f, range(11)) #So, filter returns 1, 5 and 7 
[1, 5, 7] 
+0

, die jetzt Sinn macht, ich sehe, wie der Filter Begriff schon sagt, was die Funktion im Vergleich zu der Karte der Fall ist. – samrap

+1

Eigentlich macht der Name 'map()' auch Sinn, wenn in einem Feld die Karte als Verb verwendet wird, bedeutet das, eine 1 zu 1 entsprechende Beziehung zu finden. Wie in Mathematik: "map x to y" oder in der Genetik: "Zuordnung von Diabetes zu einem Gen". Eine Sache, die zu 'Python' passt, ist einfach so: Die Namen ergeben oft Sinn. –

+0

das ist ein guter Punkt. Es ist lustig, wie ähnlich bestimmte Aspekte der Programmierung alltäglichen Beispielen sind.Wie ich bin in Algebra 2 und wir lernen über Funktionen f (x) und die Hälfte der Klasse ist ratlos, aber die Idee ist 100% ähnlich Funktionen in der Programmierung. – samrap

Verwandte Themen