Wywołanie zwrotu filtra [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak używać filtrów, map i redukować w Pythonie 3 (8 odpowiedzi) Zamknięty 3 lata temu .

Uczę się pojęcia filtrów w Pythonie. Używam takiego prostego kodu.

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

Ale zamiast dostać listę, dostaję jakąś wiadomość taką jak ta.

<filter object at 0x00FDC550>
Co to znaczy? Czy to znaczy, że moja filtrowana lista obiektów, która ma wyjść, jest przechowywana w tym miejscu pamięci? Jak uzyskać listę, której potrzebuję?
Author: Carcigenicate, 2012-09-07

2 answers

Wygląda na to, że używasz Pythona 3.x. w python3, filter, map, zip, etc zwraca obiekt, który można iterować, ale nie listę. Innymi słowy,

filter(func,data) #python 2.x

Jest równoważne:

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

Myślę, że została zmieniona, ponieważ (często) chcesz filtrować w leniwym sensie-nie musisz zużywać całej pamięci, aby utworzyć listę z przodu, o ile iterator zwróci to samo, co lista podczas iteracji.

Jeśli znasz listę wyrażenia złożone i generatorowe, powyższy filtr jest teraz (prawie) równoważny poniższemu w python3.x:

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

W przeciwieństwie do:

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

W Pythonie 2.x

 196
Author: mgilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 13:37:24

Jest to iterator zwracany przez funkcjęfilter .

Jeśli chcesz listę, po prostu zrób

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

Niemniej jednak, możesz po prostu iterować nad tym obiektem za pomocą pętli for.

for e in filter(f, range(2, 25)):
    do_stuff(e)
 24
Author: sloth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 13:26:27