개발자 블로그

[윤성우의 열혈 파이썬 중급편] - 5. map과 filter 그리고 리스트 컴프리헨션 본문

파이썬/윤성우의 열혈 파이썬 중급편

[윤성우의 열혈 파이썬 중급편] - 5. map과 filter 그리고 리스트 컴프리헨션

hayongwoon 2022. 4. 27. 17:00

map & filter

 map 함수와 filter 함수를 통해 반환되는 객체는 iterator 객체이자 generator 객체이다. 그리고 함수에 들어가는 2번째 인자는 iterable 객체여야한다. 이 특징이 map과 filter 함수의 장점이자 쓰는 이유가 되겠다. 

 

 그리고 두 함수의 차이는 첫번째 인자로 들어가는 함수의 리턴 값에 차이가 있다. filter 함수의 경우 첫번째로 들어가는 함수가 True or False를 반환을 하며 '걸러주는 기능'을 한다고 보면 된다. 

 

두 함수가 iterator 객체이자 generator 객체인 이유는 iterable 객체의 값을 순차적으로 함수와 mapping하여 값을 반환하기 때문!

generator객체에 대해서는 다음 시간에 더 자세히 알아보도록하자! 

 

*아! 그리고 함수가 map과 filter함수의 인자로 들어갈 수 있는 이유는 파이썬에서는 함수 또한 객체이기 때문이다! 그래서 람다식과 같이 함수도 객체로 활용이 가능하다! 결론은 파이썬에서는 모든 것이 객체! 때문에 함수 안에 함수를 클래스 안에 함수 및 데이터를 넣어 사용할 수 있는 것이다. 이러한 것이 바로 객체지향 프로그래밍의 강력한 효과라고 생각한다.

 

두 함수를 대신하는 리스트 컴프리헨션

사실, 두 함수를 사용하다보면 코드의 간결성이 떨어져 보일 때가 있다. 물론 항상 그렇다는 것은 아니다. 예제를 살펴보자!

>>> st = list(range(1,11))
>>> st
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> fst = list(map(lambda n : n**2, filter(lambda n : n % 2, st)))
>>> fst
[1, 9, 25, 49, 81]

1~10의 자연수 중에서 홀수들을 대상으로 그 제곱 값을 리스트에 담는 예이다! 그런데 이를 리스트 컴프리헨션으로 대체하면 다음과 같다!

>>> st = list(range(1,11))
>>> fst = [i**2 for i in st if i % 2]
>>> fst
[1, 9, 25, 49, 81]

확실히 아래 예제가 더욱 간결하다! 그러므로 map과 filter를 함께 사용하는 경우 리스트 컴프리헨션을 고려해볼 필요가 있다!

코드의 간결성만으로 무조건 적으로 이를 사용하는 것은 금물이다. 위에서 우리는 분명 map과 filter의 특징을 살펴보지 않았나, 이 두 함수는 iterator 객체이자 generator 객체이다. 반환되는 값들을 미리 만들어서 메모리에 저장해 두지 않기 때문에 리스트에 크기에 따라 메모리의 크기가 커지지 않고 항상 메모리 공간의 크기가 동일하다. 각 각의 장점을 알고 상황에 따라 사용을 하는 것이 자원 최적화를 고민할 수 있는 개발자라고 생각한다.

 

generator 객체에 대해 많은 언급을 했는데, 이어서 generator에 대해 블로깅을 해보자!