컴프리헨션
Comprehension
Python의 간결한 리스트/딕셔너리/집합 생성 문법. [x for x in iterable] 형태로 작성.
Comprehension
Python의 간결한 리스트/딕셔너리/집합 생성 문법. [x for x in iterable] 형태로 작성.
컴프리헨션(Comprehension)은 Python에서 리스트, 딕셔너리, 집합, 제네레이터를 간결하게 생성하는 문법입니다. for 루프와 조건문을 한 줄로 압축하여 가독성 높은 코드를 작성할 수 있으며, 일반적으로 동등한 for 루프보다 실행 속도도 빠릅니다.
리스트 컴프리헨션은 [expression for item in iterable if condition] 형태로 작성합니다. 예를 들어 [x*2 for x in range(10) if x%2==0]은 0부터 9까지 짝수만 골라 2배한 리스트를 생성합니다. 중첩 루프도 가능하여 2차원 데이터 처리에 유용합니다.
딕셔너리 컴프리헨션은 {key: value for item in iterable} 형태입니다. 기존 딕셔너리를 변환하거나, 리스트를 딕셔너리로 만들 때 사용합니다. 집합 컴프리헨션은 {expression for item in iterable}로 중괄호를 사용하며 중복이 자동으로 제거됩니다.
제네레이터 표현식은 소괄호를 사용하여 (expression for item in iterable) 형태로 작성합니다. 리스트 컴프리헨션과 달리 메모리에 모든 요소를 저장하지 않고 필요할 때 하나씩 생성하므로, 대용량 데이터 처리에 적합합니다.
# 리스트 컴프리헨션
squares = [x**2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 조건부 필터링
evens = [x for x in range(20) if x % 2 == 0]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 중첩 루프
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 딕셔너리 컴프리헨션
word_lengths = {word: len(word) for word in ['apple', 'banana', 'cherry']}
# {'apple': 5, 'banana': 6, 'cherry': 6}
# 집합 컴프리헨션
unique_chars = {char.lower() for char in "Hello World" if char.isalpha()}
# {'h', 'e', 'l', 'o', 'w', 'r', 'd'}
# 제네레이터 표현식 (메모리 효율적)
sum_of_squares = sum(x**2 for x in range(1000000))
# 조건 표현식과 함께
labels = ['pass' if score >= 60 else 'fail' for score in [75, 42, 88, 55]]
# ['pass', 'fail', 'pass', 'fail']
시니어: 이 데이터 필터링 로직 좀 길어요. 컴프리헨션으로 줄일 수 있을 것 같은데.
주니어: for 루프 5줄을 한 줄로요?
시니어: 네, 근데 너무 복잡하면 오히려 가독성이 떨어져요. 조건이 2개 이하면 컴프리헨션, 그 이상이면 함수로 분리하는 게 좋아요.
면접관: 리스트 컴프리헨션과 map/filter 함수의 차이점은 무엇인가요?
지원자: 리스트 컴프리헨션이 Python에서 더 관용적이고 가독성이 좋습니다. map과 filter는 lambda와 함께 쓰면 오히려 복잡해질 수 있어요. 성능은 거의 비슷하지만 컴프리헨션이 약간 빠른 경우가 많습니다.
면접관: 컴프리헨션의 단점은 없나요?
지원자: 복잡한 로직을 억지로 한 줄에 넣으면 가독성이 크게 떨어집니다. 또한 부수 효과(side effect)가 있는 코드에는 적합하지 않아요.
리뷰어: 이 컴프리헨션 좀 복잡해요. 중첩 for에 if까지 있으니까.
작성자: 한 줄로 처리하고 싶었는데...
리뷰어: 일반 for 루프로 풀어쓰거나, 내부 로직을 함수로 분리해요. 다른 사람이 읽을 때 3초 안에 이해 못하면 리팩토링 대상이에요.