옛 코드에서 보게 될 functional 페어
map(fn, iterable) 은 fn 을 각 원소에 적용. filter(pred, iterable) 은 pred(x) 가 truthy 인 원소만 유지. Python 에 영원히 있었고, 대부분 언어에 있어. 근데 *더 이상 가장 Pythonic 한 방법은 아냐*. 컴프리헨션이 거의 항상 더 잘 읽혀.
왜 컴프리헨션이 보통 이기나
[x*2 for x in nums] 가 list(map(lambda x: x*2, nums)) 보다 짧고 명확. [x for x in nums if x > 0] 이 list(filter(lambda x: x > 0, nums)) 보다 좋아. 컴프리헨션은 표현식을 앞에 두고 술어를 뒤에 둬서, 결과가 먼저 읽혀. 그 가독성 편향이 컴프리헨션이 이긴 이유의 대부분.
map / filter 가 여전히 값어치 하는 경우
두 가지 — 매핑하는 함수가 *이미 이름 있을 때* (메서드 같은) 면 map(str.upper, words) 가 [w.upper() for w in words] 보다 깔끔할 수 있어. 그리고 lazy iterator 원할 때 (list 안 만들어짐). Python 3 에서 map / filter 는 iterator 반환 — generator expression 처럼 lazy.
any / all — 저평가된 reducer
idiomatic 한 반복 헬퍼 두 개 — any(iterable) 은 어느 원소든 truthy 면 True. all(iterable) 은 모두 truthy 면 True. 둘 다 short-circuit. generator expression 과 결합하면 아름답게 읽혀 — if any(x < 0 for x in nums).
map / filter 손에 닿을 때 — 컴프리헨션이 더 깔끔하지 않은지 자문. 답이 yes 일 확률 90% 이상. 나머지는 진짜 케이스, 근데 예외야.