kyejin0412 님의 블로그

[TIL] Week 4-2 파이썬 세트, 컴프리헨션, 예외처리 본문

내일배움캠프-데이터분석

[TIL] Week 4-2 파이썬 세트, 컴프리헨션, 예외처리

kyejin0412 2025. 11. 11. 20:55

 

어제부터 감기기운이 있어서 꿀물을 마시면서 코드카타를 했다. 힐링되는 기분~

오늘은 안 졸려고 엄청 노력했다..ㅋㅋㅋㅋ 목표한 진도는 다 끝냈다. 시각화 맛보기로 1,2주차 강의까지 들었다.

파이썬 라이브세션에서는 예외처리와 컴프리헨션을 배웠다. 예외처리는 자주 쓸 것 같고 컴프리헨션은 잘 쓸 지 모르겠다. 확실히 코드가 짧아지긴 하는데.. 일단 정석 반복문으로 쓰는 걸 연습하는 게 맞는 것 같다. 예외처리에서 예외가 파이썬 내부에 정해져 있는 게 있나 찾아봤는데 몇 가지 있어서 정리했다. 저걸 내가 정의를 해줘야 하는건가 헷갈렸다. 역시 모를 땐 구글링을 해야 한다 ㅋㅋ

복습을 열심히 하자!!

 


[목차]
1. 세트(set) : 집합
2. 컴프리헨션
3. 컴프리헨션 - 흔한 실수 & 팁
4. 예외처리 try - except 문
5. 예외처리 전략
6. 파이썬 예외 종류

 

1. 세트(set) : 집합

  • 중복을 허용하지 않는다.
  • {}. 키 없이 값만 존재.
  • 선언할 때는 딕셔너리와 겹쳐서  중괄호만으로 선언 불가. s = set() 키워드로 선언.
  • 순서가 없음.
>>> s = {}
>>> type(s)
<class 'dict'>
>>> s = set()
>>> type(s)
<class 'set'>
>>> s
set()
>>> s = set([1,3,5,7]) -- 키워드 사용
>>> s
{1, 3, 5, 7}
>>> p = {1, 3, 5, 7} -- {} 에 직접 값넣어주기. 키 값 없음!
>>> p
{1, 3, 5, 7}

 

2. 컴프리헨션

  • 간결성: for + if + append 패턴을 한 줄로 요약
  • 가독성: “무엇을 만들고 싶은지”가 먼저 보여짐 (표현식 → 반복 → 조건 순)
  • 성능: 같은 일을 하는 for문보다 미세하게 빠른 경우가 많음(파이썬 내부 루프 활용)
  • 튜플 컴프리헨션은 없다!!

단, 복잡해지면 가독성이 떨어짐 → “한 줄에 2~3개의 아이디어”를 넘기지 않기

 

  • 기본 구조
-- 리스트
[표현식  for 변수 in 반복대상  if 조건]

-- 딕셔너리
{키표현식: 값표현식  for 변수 in 반복대상  if 조건}

-- 세트(집합) : 딕셔너리에서 키가 빠짐.
{표현식  for 변수 in 반복대상  if 조건}

-- 튜플 컴프리헨션은 없음 XX

 

  • 예시
  • 1~5까지 짝수이면 even, 홀수이면 odd 리스트 만들기
labels = ["even" if n % 2 == 0 else "odd" for n in range(1, 6)]
print(labels)  # ['odd', 'even', 'odd', 'even', 'odd']

 

  • 딕셔너리: 문자열 길이를 값으로
words = ["python", "data", "ai", "comprehension"]
lengths = {w: len(w) for w in words}
print(lengths)
# {'python': 6, 'data': 4, 'ai': 2, 'comprehension': 13}

 

  • enumerate() : 자동으로 인덱스, 값을 튜플 쌍으로 반환
# 키 값 -> for 생성 숫자값으로
# [1, 2, 3] 0: 1, 1: 2, 2: 3
names = ["ha", "yh", "jh"]
re = {i: name for i, name in enumerate(names)}

# enumerate -> 자동으로 인덱스, 값 -> 쌍으로 생성

 

  • 중첩 컴프리헨션 - 이중 for 문을 한 줄로 쓸 수 있음. 더 많아지면 복잡해지므로 지양.
pairs = [(i, j) for i in range(3) for j in range(3) if i != j]
print(pairs)
# [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]

 

  • set 컴프리헨션
names = ["Ann", "Bob", "ann", "BOB"]
unique_lower = {name.lower() for name in names} -- 딕셔너리와 다르게 값이 하나!!
print(unique_lower)  # {'ann', 'bob'}

 

 

3. 컴프리헨션 - 흔한 실수 & 팁

  • 읽기 어려운 한 줄 만들지 말기 (로직이 3개 넘게 얹히면 for문이 낫다)
  • 값 분기 if-else필터 if 위치 혼동 주의
  • 딕셔너리 키 중복 시 마지막 값이 덮어쓴다 (키 유일성 고려)
  • 리스트 vs 제너레이터
    • 괄호 (...)는 제너레이터 표현식(지연 생성)
    • 리스트가 필요하면 [...], 딕셔너리는 {...: ...}

제너레이터를 활용하여 튜플,리스트,세트 만들기. 출처:https://good.oopy.io/clean-code/comprehension

 

4. 예외처리 try - except 문

  • 예외처리가 중요한 이유: 예기치 못한 오류가 나면 프로그램 자체가 멈춰버림. 이를 막기 위해 예상 가능한 오류들을 try-except에서 처리해서 프로그램이 멈추지 않게 함.
    참고) dict.get("키") 도 안전하게 키 값 가져오려고 쓰는 것임. "키"가 없으면 에러가 나는데 .get() 메소드는 오류 대신 None을 반환하고 프로그램이 멈추지 않음. 
  • 에러 발생시키는 코드는 본 코드 위쪽에 작성해서 효율적으로 돌아가게 하는 것이 좋음.
    본 코드가 다 돌아가고 에러를 발견하는 것보다 먼저 발견하는게 효율적이기 때문.
try:
    # 문제가 생길 수 있는 코드
    # 에러가 발생하면 그 지점 이후의 코드들은 실행되지 않는다.
except 예외타입 as e:
    # 문제가 생겼을 때의 처리. (생략 가능, 여러 개 사용가능, 에러 처리하려면 필수)
else:
    # 예외가 전혀 발생하지 않았을 때만 실행 (생략 가능, except 있어야 사용 가능)
finally:
    # 예외 발생 여부와 무관하게 항상 실행 (생략 가능)

 

 

  • 예외처리 예시
    • 입력 예외처리
      흐름: 실패 → 안내 후 반복 / 성공 → 처리 후 break / finally는 항상 실행
while True:
    try:
        n = int(input("정수를 입력: "))
    except ValueError:
        print("정수가 아닙니다. 다시 입력하세요.")
        continue
    else:
        print(f"제곱: {n**2}")
        break
    finally:
        # 로깅 등 공통 후처리 (여기서는 생략 가능)
        pass
-- 여러 예외를 구분해서 처리
try:
    a = int(input("나눌 수: "))
    b = int(input("나누는 수: "))
    print(a / b)
except ValueError:
    print("숫자를 입력하세요.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

 

 

  • with 문 - 파일 자동으로 닫아주기
    with가 끝나면 자동으로 파일이 닫힘 (finally 역할이 내장되어 있음)
try:
    with open("data.txt", "r", encoding="utf-8") as f:
        content = f.read()
        print(content[:100])
except FileNotFoundError:
    print("파일이 없습니다.")

 

 

  • 직접 예외를 발생시키기 - raise: "오류를 발생시켜라"
    raise + 예외처리 이름("메세지") : 원하는 메세지 출력
def grade(score: int) -> str:
    if not (0 <= score <= 100):
        raise ValueError("점수는 0~100 사이여야 합니다.")
    return ("A" if score >= 90 else
            "B" if score >= 80 else
            "C" if score >= 70 else
            "D" if score >= 60 else "F")

 

 

5. 예외처리 전략

EAFP (Easier to Ask for Forgiveness than Permission) : 허락보다 용서 구하기가 쉽다.

코드를 일단 실행(try) 해보고, 만약 예외가 발생하면 예외를 처리(except) 한다.

예외가 자주 발생하지 않는다고 확신할 수 없는 상황에서, 잠재적 오류를 사후에 효과적으로 처리한다.

파이썬에서 권장하는 방법.

 

vs

 

LBYL (Look Before You Leap) : 뛰어들기 전에 살펴보기

코드를 실행하기 전에 발생할 수 있는 잠재적 오류를 미리 if 문으로 검사하여 대비하는 방법.

if 문이 많아지면 코드가 너무 길어질 수 있다. 

 

 

6. 파이썬 예외 종류

  • KeyError
    • "키 없음"
    • 주로 딕셔너리 사용시 발생하는 에러
    • 없는 Key 값에 접근하려고 할 때 발생
    • 이럴 때 get() 메소드를 활용하면 None을 반환하고 프로그램이 멈추지 않는다.
  • ValueError
    • 부적절한 값을 가진 인자를 받았을 때 발생하는 에러
    • int("abc") 처럼 숫자를 받아야 형 변환을 할 수 있는데, 문자열이 온 경우
    • 리스트에서 없는 값에 접근하려고 하는 경우
  • IndexError
    • 없는 인덱스 값에 접근하려고 할 때 (0~5까지 인덱스가 있는데, 6에 접근하려고 하는 경우)
  • SyntaxError
    • 문법 오류
  • NameError
    • 지역변수, 전역변수의 이름을 찾을 수 없는 경우
  • ZeroDivisionError
    • 숫자를 0으로 나누려는 경우
  • FileNotFoundError
    • 존재하지 않는 파일이나 디렉토리에 접근하려 할 때
  • TypeError
    • 서로 다른 타입으로 연산하려고 할 때 (1+"a")
  • AttributeError
    • 잘못된 메서드나 속성을 호출하거나 대입했을 때
  • ConnectionError
    • 서버를 켜지 않았을 때

 


 

참고 링크

https://velog.io/@maxkmh/Python-14-Error-%EC%A2%85%EB%A5%98-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC

 

Python 14 Error 종류 & 예외처리

"키 없음"주로 딕셔너리 사용시 발생하는 에러없는 Key 값에 접근하려고 할 때 발생이럴 때 get() 메소드를 사용할 수 있다 ① 딕셔너리'키'가 먼저 나온 상황 ② 딕셔너리.get('키')가 먼저 나온 상

velog.io

https://wikidocs.net/30

 

05-4 예외 처리

[[TODO]] - [v] 잘못된 내용이 있는지 논리적 오류가 없는지 확인해 줘 - [v] 작성한 내용중 어렵게 작성된 부분 또는 설명이 부족한 부분이 있는지 확인해 줘 - [v…

wikidocs.net

 

https://good.oopy.io/clean-code/comprehension

 

[Python] 파이썬 컴프리헨션 (Comprehension) 제대로 알아보기 | 일신우일신

컴프리헨션(Comprehension)은 “이해”와 관련된 영단어 Comprehend에서 유래했다. 이름에서 알 수 있듯, 파이썬에서는 컴프리헨션을 통해 보다 간결(Concise)하고 가독성이 좋은(Readable, Expressive) 코드를

good.oopy.io

https://wikidocs.net/16044

 

18. set(집합)

## 1. set(집합) - set은 수학에서 이야기하는 집합과 비슷합니다. - 순서가 없고, 집합안에서는 unique한 값을 가집니다. - 그리고 mutable 객체입니다.…

wikidocs.net