시퀀스 변환의 디폴트
"각 x 마다 y 생산" 하면 — Python 디폴트가 컴프리헨션. list 엔 [x*2 for x in xs], generator 엔 (x*2 for x in xs). for-loop-then-append 패턴은 컴프리헨션 안 맞을 때 손에 닿는 거지 반대 X.
map 와 filter — 보통 더 이상 Pythonic X
list(map(lambda x: x*2, xs)) 가 작동하지만 [x*2 for x in xs] 보다 안 읽힘. list(filter(lambda x: x > 0, xs)) 가 [x for x in xs if x > 0] 보다 안 읽힘. 예외 — 함수가 이미 named (list(map(str.upper, words))) 일 때 — 경쟁력 있음.
"시퀀스 한 번 처리" 엔 generator
컴프리헨션 결과가 한 번 소비되고 다시 반복 안 될 거면 대괄호를 괄호로 swap — sum(x*x for x in xs). 같은 로직, 중간 list X, 가능한 곳에 short-circuit. 큰 또는 무한 시퀀스 처리하는 코드의 큰 승리.
기술 — 모양 인식
pythonic 기술이 "어디나 컴프리헨션 사용" X. 변환이 거기 맞을 때 인식. 안의 로직이 두 줄이거나 분기 여러 개면 진짜 for-loop 짜거나 헬퍼 함수 추출. Pythonic = "복잡도에 문법 맞춤".
Pythonic Way: 한 줄 변환 디폴트로 컴프리헨션. reducer (
sum, any, all, max) 에 먹이거나 source 가 거대할 때 디폴트로 generator. 원소별 로직이 단일 식 넘을 때만 명시적 loop.