2013-09-22 19 views
19

Sto leggendo la documentazione di Python per approfondire veramente il linguaggio Python e ho trovato le funzioni filtro e mappa. Ho usato il filtro prima, ma non ho mai mappato, anche se ho visto entrambi in varie domande su Python qui su SO.Python: Differenza tra filtro (funzione, sequenza) e mappa (funzione, sequenza)

Dopo aver letto su di loro nel tutorial Python, sono confuso sulla differenza tra i due. Ad esempio, dal 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] 

e

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

Questi sembrava quasi esattamente la stessa funzione a me, così sono andato in terminale per eseguire Python in modo interattivo e testati fuori mio caso. Ho utilizzato map sia per la prima che per la seconda istanza sopra e per la prima (return x % 2 != 0 and x % 3 != 0) ha restituito un elenco di valori booleani anziché numeri.

Perché il valore map restituisce talvolta un valore booleano e altre volte il valore di ritorno effettivo?

Qualcuno può spiegarmi esattamente la differenza tra map e filter?

risposta

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

è equivalente a

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

Mentre la lista restituita da

filter(f, range(2, 25)) 

è equivalente a result dopo l'esecuzione

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

Si noti che quando si utilizza map, gli elementi nel risultato sono valori restituiti dalla funzione cube.

Al contrario, i valori restituiti da f in filter(f, ...) non sono gli articoli in result. f(i) viene utilizzato solo per determinare se il valore i deve essere conservato in result.

12

filter(), come suggerisce il nome, filtra l'originale iterabile e ritenta gli articoli che restituiscono True per la funzione fornita a filter().

map() d'altra parte, applicare la funzione fornita a ciascun elemento dell'iterazione e restituire un elenco di risultati per ciascun elemento.

Segue l'esempio che hai dato, confrontiamo loro:

>>> 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

che ha senso ora, vedo come il termine del filtro suggerisce ciò che la funzione fa contro mappa. – samrap

+1

In realtà anche il nome 'map()' ha senso, in alcuni campi quando la mappa viene usata come verbo significa trovare la relazione corrispondente da 1 a 1. Come in matematica: "mappa xey" o in genetica: "mappa il diabete in un gene". Una cosa bella di 'Python' è proprio così: i nomi spesso hanno un senso. –

+0

questo è un buon punto. È strano come alcuni aspetti della programmazione siano simili agli esempi di tutti i giorni.Come se fossi in algebra 2 e stiamo imparando le funzioni f (x) e metà della classe è stumped ma l'idea è simile al 100% alle funzioni di programmazione. – samrap

Problemi correlati