#Python - 35. 파이썬 raise
본문 바로가기
Programming/Python

#Python - 35. 파이썬 raise

by 권가 2020. 2. 13.

raise를 이용해 예외를 직접 발생시켜 수를 맞추는 게임(UP, DOWN)을 만들어봤습니다.

import random
answer = random.randint(1, 10)
print('UP DOWN 게임을 시작합니다.(1~10) 3번의 기회!')
print('정답: ', answer)
count = 0
try:
    while True:
        try:
            choice = input('수 입력>')
            choice = int(choice)
            if choice < 1 or 10 < choice:
                print('1~10 정수 입력...')
                continue
            else:
                if choice == answer:
                    print('정답입니다!\n정답={}\n입력한 수={}'.format(answer, choice))
                    raise StopIteration
                elif count == 2:
                    print('3번의 기회가 끝났습니다.\n종료...')
                    raise StopIteration
                elif choice > answer:
                    print('DOWN! 남은 기회=', 2-count)
                elif choice < answer:
                    print('UP! 남은 기회=', 2-count)
                count = count + 1
        except ValueError:
            print('정수를 입력하세요...')
except StopIteration:
    print('프로그램 종료...')

코드 설명

Line 1: random 모듈을 가져왔습니다.

Line 2: 1부터 10까지 무작위로 정수를 하나 가져와 answer이라는 이름의 변수에 저장합니다.

Line 5: count라는 이름의 변수를 선언하며 값은 0으로 초기화 시켰습니다.

Line 6: 1번째 try문 시작

Line 7: while문에 조건을 항상 참으로 설정해 무한 반복 시켰습니다.

Line 8: 2번째 try 문 시작

Line 9: 사용자의 선택을 python의 input 메서드로 받아 choice라는 이름의 변수에 저장합니다.

Line 10: input으로 받은 변수가 문자열일 수 있기에 int()메서드로 정수형으로 변환합니다.

Line 11: 사용자가 입력한 수가 1~10(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이 아니면

Line 13: continue명령으로 while 반복문으로 다시 갑니다.

Line 14: 사용자가 입력한 수가 1~10(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이면

Line 15: 사용자의 입력(choice)과 정답(answer)이 같으면

Line 17: StopIteration을 고의적으로 발생시킨다.

Line 18: count라는 이름의 변수(초기값 0으로 시작)의 값이 0 -> 1 -> 2가 되는 순간

Line 20: StopIteration을 고의적으로 발생시킨다.

Line 21: 사용자의 입력(choice)이 정답(answer)보다 클 때 DOWN 출력

Line 21: 사용자의 입력(choice)이 정답(answer)보다 작을 때 UP 출력

Line 25: 한 반복이 끝나면 count를 1씩 증가시킨다.

Line 26: python의 input 메서드로 사용자의 입력(choice)을 받을 때 정수가 아닌 모든 것이 들어올 때 발생하는 ValueError를 캐치해 예외 처리

Line 28: StopIteration 예외 발생시 받는 부분으로 Line 17, 20 에서 raise StopIteration로 고의적으로 예외를 발생시켜 프로그램을 즉시 중단 시키는 역할을 한다.

 

이중 반복문에서의 raise

1. 모든 place에서 마피아 찾기

list = {'공원':['민간인', '민간인', '의사'],
        '빌딩':['마피아', '민간인', '경찰'],
        '주택':['마피아', '마피아', '민간인']}
for place, job in list.items():
    for search in job:
        if search == '마피아':
            print('{}에 {}가 있습니다!'.format(place, search))

첫 번째 for문에서 딕셔너리의 키들을 탐색하고

두 번째 for문에서 딕셔너리의 키들의 값들을 탐색하므로

모든 마피아를 찾을 수 있습니다.

2. place에서 첫 번째로 나타나는 마피아 찾기

list = {'공원':['민간인', '민간인', '의사'],
        '빌딩':['마피아', '민간인', '경찰'],
        '주택':['마피아', '마피아', '민간인']}
for place, job in list.items():
    for search in job:
        if search == '마피아':
            print('{}에 {}가 있습니다!'.format(place, search))
            break

첫 번째 for문에서 딕셔너리의 키들을 탐색하고

두 번째 for문에서 딕셔너리의 키들의 값들을 탐색하므로

break문이 실행되는 순간 두 번째 for문(키들의 값들을 탐색하는)을 탈출합니다.

이에 따라 딕셔너리의 각 키들에 대해 첫 번째로 나타나는 마피아를 찾게 됩니다.

3. 첫 번째로 나타나는 마피아 찾기

list = {'공원':['민간인', '민간인', '의사'],
        '빌딩':['마피아', '민간인', '경찰'],
        '주택':['마피아', '마피아', '민간인']}
try:
    for place, job in list.items():
        for search in job:
            if search == '마피아':
                print('{}에 {}가 있습니다!'.format(place, search))
                raise StopIteration
except StopIteration:
    print('Stop Iteration 로 이중 반복 문 즉시 탈출...')

첫 번째 for문에서 딕셔너리의 키들을 탐색하고

두 번째 for문에서 딕셔너리의 키들의 값들을 탐색하므로

모든 딕셔너리를 탐색하다가 첫 번째로 마피아를 찾는 순간

raise StopIteration이 실행되면서 (StopIteration)에러를 발생합니다.

Line 10에서 except StopIteration로 에러를 받아 출력 후 프로그램을 종료시킵니다.

만약 raise StopIteration만 있고 except StopIteration로 에러를 받지 않는다면

이러한 결과를 볼 수 있다!

빨간 글씨는 너무너무 싫어요ㅠㅠ

그러나 나타지 않으면 불안한 내 심정을 아니?...

댓글