본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

4일차. 제어문 & 예외 처리

더보기

 

4일 차 회고.

 

오늘 토이 프로젝트 참가 여부를 신청받았는데 계속 고민하다가 지금은 공부에 더 집중해야 할 것 같아서 참여하지 않기로 결정했다. 프로젝트를 진행하며 공부할 수 있겠지만, 그래도 시간이 너무 부족할 것 같았다. 너무 선택의 연속이고 이에 따른 후회도 많지만 받아들이고 차근차근 나아가야 할 것 같다..

 

 

 

 

0. 가상환경 세팅

 

 

이제는 수업 시작 전에 자연스럽게 가상환경을 세팅해 준다.

py -3.13 -m venv .venv			# 가상환경 생성
.\.venv\Shells\activate			# 가상환경 활성화
python -m pip install --upgrade pip	# pip 업그레이드
pip install jupyter			# jupyter 설치

 

 

 

1. 제어문

 

 

1-1. 가위 바위 보

 

먼저, 내가 짠 코드이다.

import enum

a = input("당신은 A입니다. [ 가위, 바위, 보 ] 중 입력해주세요.")
b = input("당신은 B입니다. [ 가위, 바위, 보 ] 중 입력해주세요.")

print(f"A: {a}")
print(f"B: {b}")

if a == b:
    print("무승부입니다.")
elif (a == '가위' and b == '바위') or (a == '바위' and b == '보') or (a == '보' and b == '가위'):
    print("A가 이겼습니다.")
elif (a == '가위' and b == '보') or (a == '바위' and b == '가위') or (a == '보' and b == '바위'):
    print("B가 이겼습니다.")
else:
    print("다시 실행하십시오.")

 

그리고 다음은 강사님이 주신 코드를 보고 다시 짠 코드이다.

import enum

class RSP_GAME(enum.Enum):
    가위 = {
        "바위": "패배",
        "보": "승리"
    }
    바위 = {
        "가위": "승리",
        "보": "패배"
    }
    보 = {
        "가위": "패배",
        "보": "승리"
    }

A = input("당신은 A입니다. [ 가위, 바위, 보 ] 중 입력하세요.")
A = A.strip()
if A not in RSP_GAME.__members__:
    print("잘못 입력하였습니다.")
else:
    A = RSP_GAME[A]
    print(f"A: {A.name}")

    B = input("당신은 B입니다. [ 가위, 바위, 보 ] 중 입력하세요.")
    B = B.strip()
    if B not in RSP_GAME.__members__:
        print("잘못 입력하였습니다.")
    else:
        B = RSP_GAME[B]
        print(f"B: {B.name}")

        if A == B:
            print("무승부입니다.")
        else:
            print(f"A가 {A.value[B.name]}하였습니다.")
            print(f"B가 {B.value[A.name]}하였습니다.")

 

위 코드는 지금까지 배운 내용을 기반으로 작성한 코드로, 추후에는 더 좋은 코드로 작성할 수 있을 것이다.

 

1-2. 반복문(while)

 

while문은 for문과 마찬가지로 반복적인 작업을 할 때 사용할 수 있다. 코드의 차이는 다음과 같다.

while문은 조건문이 True인 경우에 실행하고, False인 경우에 while문을 종료한다.

while문의 경우, while문 이전에 초기값을 설정해야 하는 경우가 있다.

# for문
lst = [1, 2, 3, 4, 5]
for i in lst
    print(i)

# while문
lst = [1, 2, 3, 4, 5]
i = 0
while i < len(lst):
    print(lst[i])
    i = i + 1

 

while문 또한 정상적으로 완료되었는지 확인하기 위해 else를 사용할 수 있다.

lst = [1, 2, 3, 4, 5]
lst_len = len(lst)
i = 0

while i < lst_len:
    if lst[i] % 2 == 0:
        print(f"{lst[i]}는 짝수입니다.")
    i = i + 1
else:
    print("Hello World")

 

 

 

2. 예외 처리

 

 

2-1. Value Error

 

Value Error는 부적절한 데이터를 가진 인자를 받았을 때 발생하는 에러이다.

 

 

2-2. Index Error

 

Index Error는 인덱스 범위를 벗어나는 경우에 발생하는 에러이다.

 

 

2-3. Syntax Error

 

Syntax Error는 문법 오류가 발생하는 경우에 발생하는 에러이다.

 

 

2-4. Name Error

 

Name Error는 변수명을 찾을 수 없는 경우에 발생하는 에러이다.

 

 

2-5. Zero Division Error

 

Zero Division Error는 0으로 나누려는 경우에 발생하는 에러이다.

 

 

2-6. Type Error

 

Type Error는 잘못된 타입을 사용했을 때 발생하는 에러이다.

 

 

2-7. Attribute Error

 

Attribute Error는 속성을 참조 또는 대입에 실패한 경우에 발생하는 에러이다.

 

 

2-8. Key Error

 

Key Error는 딕셔너리에서 접근하려는 키 값이 없는 경우에 발생하는 에러이다.

 

 

2-9. 예외 처리

 

예외 처리는 다음과 같이 한다.

try:
    ...
except <Error Type>:	# 오류 종류를 선언하지 않으면, Exception
    print("Exception Handling")

 

이때, 오류 종류가 다르면 예외 처리되지 않는다.

 

except문은 여러 개 작성할 수 있다. 이때, except문은 if문처럼 작동하기 때문에 범위가 좁은 에러부터 작성해야 한다.

else문은 예외가 발생하지 않을 경우 작동한다.

 

finally문은 맨 마지막에 오류의 발생 여부와 상관없이 작동한다.

 

 

2-10. assert

 

assert는 조건이 False일 때, 오류 메시지를 출력한다.

 

 

2-11. raise

 

raise는 예외를 강제로 발생시킬 때 사용한다. 이때, raise 뒤에는 발생시키고 싶은 예외 이름을 작성한다.

 

 

2-12. Exception 생성

 

아직 class를 배우지는 않았지만, 다음과 같은 방법으로 새로운 예외를 만들어 발생할 수 있다.

 

 

 

3. 가위 바위 보 코드

 

다음 시간에 다시 수정하기

import enum

class Game(enum.Enum):
    가위 = {
        '바위': '패배',
        '보': '승리'
    }
    바위 = {
        '가위': '승리',
        '보': '패배'
    }
    보 = {
        '가위': '패배',
        '바위': '승리'
    }

while(1):
    A = input("A: [ 가위, 바위, 보 ] 중에서 입력하시오.")
    A = A.strip()
    if A not in Game.__members__:
        print("A: 다시 입력하시오.")
    else:
        A = Game[A]
        print(f"A: {A.name}")
        break

while(1):
    B = input("B: [ 가위, 바위, 보 ] 중에서 입력하시오.")
    B = B.strip()
    if B not in Game.__members__:
        print("B: 다시 입력하시오.")
    else:
        B = Game[B]
        print(f"B: {B.name}")
        break

if A.name == B.name:
    print("무승부입니다.")
else:
    print(f"A가 {A.value[B.name]}했습니다.")
    print(f"B가 {B.value[A.name]}했습니다.")