2012-09-07 3 views
70

저는 파이썬에서 필터의 개념을 배우고 있습니다. 이런 간단한 코드를 실행 중입니다.Python3의 필터

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

목록을받는 대신이 메시지가 표시됩니다.

<filter object at 0x00FDC550> 

이것은 무엇을 의미합니까? 필자가 필터링 한 객체, 즉 목록이 메모리 위치에 저장된다는 의미입니까? 필요한 목록을 어떻게 얻을 수 있습니까?

답변

118

파이썬 3.x를 사용하고있는 것처럼 보입니다. python3에서 filter, map, zip 등은 반복 가능한 객체를 반환하지만 목록은 반환하지 않습니다. 당신은 소비 할 필요가 없습니다 - 당신 (자주)이 게으른 의미에서 필터링을 원하기 때문에 내가이 변경된 생각

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

:에 즉,

filter(func,data) #python 2.x 

은 동일합니다 반복자가 반복 중에 목록과 동일한 것을 반환하는 한 모든 메모리가 목록을 앞쪽에 만듭니다.

[ x for x in data if func(x) ] 
: 반대로

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

: 당신은 지능형리스트 및 발전기 표현에 익숙하다면

은, 위의 필터는 이제 python3.x에 다음 (거의) 동일합니다

in python 2.x

+0

고마워요. 또한이 번호가 무엇인지 말해 주실 수 있습니까? 0x00FDC550 – user1190882

+3

그게 개체의 ID입니다. CPython에서는 메모리 위치입니다. – mgilson

+1

와우 ... 흥미 롭습니다 ... [] snd list()가 동등하지만 [filter (func, data)]가 동일하게 작동하지 않는다고 생각했습니다. – user2846569

19

filter 함수에 의해 반환 된 iterator입니다.

당신이 목록을 원하는 경우에, 다만 그럼에도 불구하고, 당신은 단지 for 루프를이 객체를 반복 할 수

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

을한다.

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

고마워. 또한,이 번호가 무엇인지 말해 주시겠습니까? 0x00FDC550 – user1190882

+0

그 개체의 메모리 주소입니다. 객체의 클래스가 ['__repr__()'] (http://docs.python.org/library/functions)가없는 경우 객체를 인쇄 할 때 기본 출력입니다.html # repr) 메소드를 사용하여 출력을 제어합니다. – sloth