2012-09-07 13 views
70

Sto imparando il concetto di filtri in Python. Sto facendo funzionare un codice semplice come questo.Filtri in Python3

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
>>> filter(f, range(2, 25)) 

Ma invece di ottenere una lista, ricevo un messaggio come questo.

<filter object at 0x00FDC550> 

Cosa significa? Significa che il mio oggetto filtrato, l'elenco che viene fuori, viene archiviato in quella posizione di memoria? Come ottengo la lista di cui ho bisogno?

risposta

118

Sembra che tu stia usando python 3.x. In python3, filter, map, zip, ecc restituisce un oggetto che è iterabile, ma non un elenco. In altre parole,

filter(func,data) #python 2.x 

è equivalente a:

list(filter(func,data)) #python 3.x 

Credo che sia stato cambiato perché è (spesso) vuole fare il filtraggio in un certo senso pigro - Non hai bisogno di consumare tutta la memoria per creare una lista in primo piano, a patto che l'iteratore restituisca la stessa cosa che una lista farebbe durante l'iterazione.

Se si ha familiarità con list comprehension e le espressioni del generatore, il filtro sopra è ormai (quasi) equivalente al seguente in python3.x:

(x for x in data if func(x)) 

Al contrario:

[ x for x in data if func(x) ] 

in python 2.x

+0

Grazie mille. Inoltre, per favore puoi dirmi qual è questo numero 0x00FDC550 – user1190882

+3

Questo è l'ID dell'oggetto. In CPython, è la posizione di memoria. – mgilson

+1

wow ... interessante ... ho pensato [] snd list() sono equivalenti, ma [filter (func, dati)] non funziona lo stesso – user2846569

19

È un iterator restituito dalla funzione filter.

Se si desidera un elenco, basta fare

list(filter(f, range(2, 25))) 

Tuttavia, si può semplicemente iterare questo oggetto con un ciclo for.

for e in filter(f, range(2, 25)): 
    do_stuff(e) 
+0

Grazie mille. Inoltre, per favore puoi dirmi qual è questo numero 0x00FDC550 – user1190882

+0

È l'indirizzo di memoria di quell'oggetto. È l'output predefinito quando si stampa un oggetto se la classe di quell'oggetto non ha il ['__repr__()'] (http://docs.python.org/library/functions.html # repr) metodo utilizzato per controllare l'output. – sloth