데이터 분석 TIL - 컴프리헨션과 예외처리

테리·2025년 11월 11일

1. 학습 키워드

  • 컴프리헨션
  • 예외 처리(raise 사용)

2. 학습 내용

컴프리헨션

  • 반복문을 한줄로 줄이는 문법(for문을 짧고 간단하게 쓰는 방법)
  • 파이써닉(파이썬 활용시 깔끔하고 읽기 좋은 코드로 작성)을 위해 사용
  • 정석적인 for 문 사용보다 코드 실행 속도가 더 빠름
  • 무조건 좋은 것이 아니라 컴프리헨션 사용으로 인해 너무 복잡해져 가독성을 떨어뜨린다면 사용하면 안됨

리스트 컴프리헨션

[표현식 for 변수 in 반복대상 if 조건문]

ex-1)

result = []
for i in range(1, 5):
	result.append(i)

컴프리헨션으로 작성하면?

result = [i for i in range(1, 5)]

ex-2)

result3 = []
for i in range(1, 6):
    if i % 2 ==0:
        result3.append(i**2)

컴프리헨션으로 작성하면?

result3 = [i**2 for i in range(1, 6) if i % 2 ==0]

딕셔너리 컴프리헨션

{키표현식: 값표현식 for 변수 in 반복대상 if 조건}

ex-1) 리스트 항목을 키로 넣어보자

students = ['철수', '영희', '유선']
{student: 0 for student in students} # {'철수': 0, '영희': 0, '유선': 0}

ex-2) 단어의 길이를 값으로 넣어보자

words = ['python', 'data', 'ai']
length = {w: len(w) for w in words}

ex-) 단어의 길이가 3 이상인 단어만 딕셔너리 형태로 만든다면?

words = ['python', 'data', 'ai']
length = {w: len(w) for w in words if len(w) >= 3}

[주로 사용하는 경우]

  • enumerate()를 사용해 여러 값을 순서대로 딕셔너리 형태로 만들고 싶을 때 주로 사용함.

키 컴프리헨션을 반대로 정석 for 문으로 작성해보자.

names = ['ha', 'yh', 'jh']
re = {i: name for i, name in enumerate(names)}
dic = {}
for idx, n in enumerate(names):
	dic[idx] = n

셋 컴프리헨션

  • for문을 한 줄로 줄여서 중복 없는 값들의 모음(집합)을 만드는 방법
  • 리스트 컴프리헨션과 비슷하지만 결과가 셋으로 만들어짐.
{값 for 변수 in 자료}
ex)
names = ['ha', 'yh', 'yh', 'Ha', 'jh']
unique ={name.lower() for name in names}

중첩 컴프리헨션

  • 2중 for문

ex) 컴프리헨션으로 작성해보자

for i in range(2, 10):
    for j in range(1, 10):
        print(f'{i} x {j} = {i*j}')
li = [f'{i} x {j} = {i*j}' for i in range(2, 10) for j in range(1, 10)]
for i in li:
    print(i)

예외처리(raise 사용)

  • 단순 예외 처리를 할 수도 있고 try 안에 내가 생각하는 상황의 예외를 만들어서 예외 처리를 할 수도 있다.
try:
# 문제가 생길 수 있는 코드
    # 범위 확인
    # 조건문
    # 다시 입력해주세요
except:
# 문제가 생겼을 때의 처리 코드
else: (선택)
# 예외가 발생하지 않았을 때 실행하는 코드
finally: (선택)
# 예외가 있건 없건 무조건 실행하는 코드

ex)

def gugudan(n):
    try:
        # 경우 따지기
        # 범위 확인
        if not isinstance(n, int): # n이라는 값이 int냐 아니냐
            raise TypeError('정수 숫자만 입력해주세요.')
        
        if not (2 <= n <= 9):
            # raise: 발생시켜라
            raise ValueError('2~9까지 숫자를 입력해주세요.')
        
        for i in range(1, 10):
            print(f'{n} x {i} = {n * i}')
    
    except ValueError:
        print(f'[범위 오류] {ValueError}') # 범위 오류가 위에서 발생하면 여기로 와서 오류를 발생시킴
    except TypeError as te: # 약어를 사용해서 줄일수도 있다.
        print(f'[타입 오류] {te}')

주의!
if not isinstance()보다 if not (2 <= n <= 9)를 먼저 작성하면 어떻게 될까?

위 코드 처럼 숫자의 범위를 따지는 코드가 먼저 작성된 상태에서 만약 gugudan('10')과 같이 정수가 아닌 값이 들어올 경우 첫번째 조건문에서 ValueError가 아니라TypeError가 발생함. 첫번째 조건문에서 문자를 숫자와 범위 비교를 할 수 없기에 파이썬 내부 에러가 발생하는데 이 경우 발생하는 에러가 TypeError이다.

그렇기에 범위에 대한 예외 처리보다 타입에 대한 예외 처리를 먼저 해주는 것이 좋다.


추가로 아래처럼 단순 예외 경우만 설정할 경우 의도와 다르게 작동할 수 있다.(문자열을 반복 출력함)

3. 배운점

  1. 컴프리헨션의 여러 종류에 대해서 학습해보면서 딕셔너리, 셋 컴프리헨션은 처음 알게됐다. 2중 for문은 대략적으로만 알고 있었는데 막상 작성해보려니 앞뒤 순서가 헷갈렸는데 이번 기회에 명확히 알 수 있었다.
  2. 나는 주로 크롤링 할 때 예외처리를 하다보니 예외 상황에 대해 직접 지정해주는 것 보다 단순하게 try에는 내가 실행하고자 하는 코드를, except에는 예외 상황에 대한 실행 코드를 작성하는 방식으로 사용했었다. 그러다보니 내가 try에서 예외 상황을 직접 만들고 이것을 except에서 사용하는 방식에 대해 잘 모르고 있었다. 혹시 다음에 사용하게 됐을 때 기억이 안난다면 이 페이지를 다시 참고해야겠다.

0개의 댓글