kyejin0412 님의 블로그
[TIL] Week 4-2 파이썬 세트, 컴프리헨션, 예외처리 본문
어제부터 감기기운이 있어서 꿀물을 마시면서 코드카타를 했다. 힐링되는 기분~
오늘은 안 졸려고 엄청 노력했다..ㅋㅋㅋㅋ 목표한 진도는 다 끝냈다. 시각화 맛보기로 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 제너레이터
- 괄호 (...)는 제너레이터 표현식(지연 생성)
- 리스트가 필요하면 [...], 딕셔너리는 {...: ...}

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
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
18. set(집합)
## 1. set(집합) - set은 수학에서 이야기하는 집합과 비슷합니다. - 순서가 없고, 집합안에서는 unique한 값을 가집니다. - 그리고 mutable 객체입니다.…
wikidocs.net
'내일배움캠프-데이터분석' 카테고리의 다른 글
| [Week 5-4] 파이썬 결측치/이상치 처리, 기초 프로젝트 주제 정하기 (0) | 2025.11.20 |
|---|---|
| [TIL] Week 4-3 파이썬 라이브러리, 파일 입출력 (1) | 2025.11.12 |
| [TIL] Week 4-1 파이썬 복습 (1) | 2025.11.10 |
| [TIL] Week 3-5 데이터 리터러시 (1) | 2025.11.07 |
| [TIL] Week 3-4 파이썬 라이브세션 - 함수 (0) | 2025.11.06 |