[Python] Comprehension

해피해피슈크림·2025년 3월 28일
post-thumbnail

⭐ 정의) 컴프리헨션 (Comprehension)

컴프리헨션기존 Iterable에서 새로운 자료구조(List, Dict, Set)을 생성하는 구문이다. 컴프리헨션을 사용하면 for문을 더욱 간결하게 작성할 수 있다.

컴프리헨션은 결과를 넣을 새로운 자료구조 타입에 따라 다음 세 가지가 있다.

  • 리스트 컴프리헨션
  • 딕셔너리 컴프리헨션
  • 셋 컴프리헨션

튜플은 컴프리헨션 문법이 따로 없으며, 대신 tuple() 함수를 사용한다.

아래 코드 설명을 보며 컴프리헨션 구문을 이해해보자. 🚀🌟

✅ for문 vs 리스트 컴프리헨션

아래 두 코드는 같은 내용이다.

# 일반적인 for문 사용
squares = []
for x in range(5):
    squares.append(x**2)
print(squares)  # [0, 1, 4, 9, 16]

➡️ for문을 사용하면 리스트 초기화 -> 반복문 -> append() 과정이 필요하다.

# 리스트 컴프리헨션 사용
squares = [x**2 for x in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

➡️ 컴프리헨션을 사용하면 간결하게 작성할 수 있다!

💡 컴프리헨션은 기존 Iterable의 원소들을 처리한 결과를 새로운 자료구조에 넣을 때 사용한다.

✅ if 조건문과 함께 사용하기

💡 또한, 컴프리헨션은 특정 조건이 True인 값들을 새로운 자료구조에 넣을 때 사용한다.

아래 두 코드는 같은 내용이다.

# for문 + if 조건문
evens = []
for x in range(10):
    if x % 2 == 0:
        evens.append(x)
print(evens)  # [0, 2, 4, 6, 8]
# 리스트 컴프리헨션
evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

➡️ if 조건문도 더 간결하게 표현할 수 있다!

✅ 딕셔너리 컴프리헨션

아래 두 코드는 같은 내용이다.

# for문 사용
squares_dict = {}
for x in range(5):
    squares_dict[x] = x**2
print(squares_dict)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 딕셔너리 컴프리헨션
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

➡️ 딕셔너리도 컴프리헨션을 활용해 한 줄로 간결하게 만들 수 있다!

🚨 언제나 컴프리헨션이 좋은 건 아니다!

💡 컴프리헨션이 너무 길어지면 오히려 읽기 어려울 수 있으므로 적절한 길이로 유지하는 것이 중요하다. for문이나 if문이 다수 중첩되는 경우는 for문을 쓰자.

# 복잡한 리스트 컴프리헨션 (읽기 어려움)
result = [x**2 for x in range(10) if x % 2 == 0 if x > 4]
# 가독성을 고려한 for문
result = []
for x in range(10):
    if x % 2 == 0 and x > 4:
        result.append(x**2)

이렇듯 for문이 더 가독성이 좋은 경우도 있다.

🤔 질문! for문을 써서 화면에 "출력"하는 경우도 컴프리헨션을 쓰면 안 되나요?

💡 컴프리헨션은 새로운 자료구조(List, Dict, Set)을 생성하는 구문이기 때문에, 단순히 for문을 이용해 출력하는 용도로는 사용하지 않는 게 일반적이다.

아래 코드를 살펴보자.

✅ 리스트 컴프리헨션 사용 예시

squares = [x**2 for x in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

위처럼 컴프리헨션은 결과를 새로운 리스트로 저장하는 용도로 쓰는 것이다.

❌ 출력만을 위한 컴프리헨션 (비추천)

[x**2 for x in range(5)]  # 리스트를 만들지만 변수에 저장하지 않음


이 코드는 리스트를 생성하지만 변수에 저장하지 않기 때문에 불필요한 메모리 낭비가 발생한다.

이런 경우 for문을 쓰는 게 더 낫다.

for x in range(5):
    print(x**2)  # 출력만 한다면 for문을 사용하는 것이 더 적절함

예시를 하나 더 살펴보자.

squares = [print(x**2) for x in range(5)]  # 비추천! None으로 채워진 리스트가 생김

위 코드는 print()의 반환값인 None을 리스트에 저장한다. 이 경우 for문이 더 적절하다.

🍒 요약

  • 컴프리헨션기존 Iterable에서 새로운 자료구조(List, Dict, Set)을 생성하는 구문이다. 컴프리헨션 구문을 이용하면 for문을 좀 더 간결하게 쓸 수 있다.

  • if문을 넣어 조건을 추가할 수 있다.

  • 코드가 복잡한 경우 for문이 가독성이 더 좋은 경우가 있다.

  • 컴프리헨션은 자료구조를 "생성"하는 데 쓴다. 화면에 출력하는 용도로는 for문을 쓴다.

0개의 댓글