map과 filter는 「함수형 프로그래밍 스타일」을 파이썬에 들여온 두 도구입니다.
한 함수를 컬렉션의 모든 요소에 적용하거나, 조건에 맞는 요소만 골라내는 일을 함수로 표현할 수 있습니다.
map(func, iterable).
모든 요소에 함수를 적용한 새 iterable 반환.
nums = [1, 2, 3, 4].
doubled = list(map(lambda x: x * 2, nums)) — [2, 4, 6, 8].
for 반복문 + append 패턴을 한 줄로 끝냅니다.
filter(func, iterable).
함수 결과가 True인 요소만 남김.
evens = list(filter(lambda x: x % 2 == 0, nums)) — [2, 4].
None을 함수로 주면 Truthy 요소만 남깁니다 — filter(None, [1, 0, "", "hi"]) → [1, "hi"].
현대 파이썬에서는 「리스트 컴프리헨션이 더 파이썬스럽다」는 평가가 일반적입니다.
doubled = [x * 2 for x in nums] — map보다 깔끔.
evens = [x for x in nums if x % 2 == 0] — filter보다 명료.
PEP 작성자 귀도 본인도 컴프리헨션을 더 권장한 바 있습니다.
그래도 map·filter가 유용한 자리가 있습니다.
「이미 정의된 함수」를 적용할 때 — names = list(map(str.upper, names)) — 가 컴프리헨션보다 짧습니다.
또 다른 함수형 언어 스타일에 익숙한 사람에게는 자연스러운 표현이며, 큰 데이터를 메모리 효율적으로 처리할 때 제너레이터를 함께 활용하기 좋습니다.
한 줄 요약
map은 모든 요소에 함수 적용, filter는 조건에 맞는 요소만 선택합니다.
현대 파이썬은 리스트 컴프리헨션을 더 권장하지만, 정의된 함수를 적용할 때는 map이 더 짧을 수 있습니다.
더 알아볼 것
- map vs 리스트 컴프리헨션 — 언제 무엇을
- reduce — functools로 옮겨간 함수
- 함수형 vs 명령형 스타일 논쟁