Подтвердить что ты не робот

Фильтры в Python3

Я изучаю концепцию фильтров в Python. Я запускаю простой код, подобный этому.

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

Но вместо получения списка, я получаю сообщение вроде этого.

<filter object at 0x00FDC550>

Что это значит? Означает ли это, что мой фильтрованный объект, который входит в список, хранится в этой ячейке памяти? Как получить список, который мне нужен?

4b9b3361

Ответ 1

Похоже, вы используете python 3.x. В python3, filter, map, zip и т.д. Возвращают объект, который является итерируемым, но не списком. Другими словами,

filter(func,data) #python 2.x

эквивалентно:

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

Я думаю, что он был изменен, потому что вы (часто) хотите сделать фильтрацию в ленивом смысле. Вам не нужно потреблять всю память для создания списка спереди, если итератор возвращает то же самое вещь будет во время итерации.

Если вы знакомы с выражениями в списках и выражениями генератора, указанный выше фильтр теперь (почти) эквивалентен следующему в python3.x:

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

В отличие от:

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

в python 2.x

Ответ 2

Это iterator, возвращенный функцией filter.

Если вам нужен список, просто

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

Тем не менее, вы можете просто перебрать этот объект с помощью цикла for.

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