학습 정리 - 예외 처리, 스페셜 메서드 (2025.01.10)

수아·2025년 1월 10일
0

학습 정리

목록 보기
9/51
post-thumbnail

회고 리스트

1.파이썬에서의 기본적인 예외 방법은?

try ~ except~ finally~
파이썬에서 예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 안전하게 처리하여 프로그램이 중단되지 않도록 하는 기능이다.

(강사님은 파이썬은 에러 발생 시 "즉사"라고 말씀하셨다.ㅋㅋㅋㅋㅋ)

2. try excetion finally를 설명하시오.

  • try
    : 예외가 발생할 수 있는 코드를 작성한다.

  • except
    : try 블록에서 발생한 예외를 처리한다.
    : 모든 예외를 처리할수도 있고 예외 유형을 명시하여 특정 예외를 처리할수도 있다.

  • finally
    : 예외 발생 여부와 상관없이 항상 실행되는 코드이다.
    : try 블록에서 예외가 발생하지 않아도 finally가 실행되고
    : try 블록에서 예외가 발생해도 except 블록 실행 후 finally 블록이 실행된다.

3. ramdom 모듈의 아래의 함수에 대하여 설명하시오.

  • shuffle
    : 리스트 등 시퀀스(변경 가능한 자료형)의 요소 순서를 무작위로 섞는다.
    (shuffle()은 반환값이 없고 해당 리스트를 직접 변경한다.)

  • randrange
    : randrange(a, b)의 경우 a부터 b-1까지 범위의 정수를 반환한다.
    : randrange(a, b, step)의 경우 step 값을 지정하여 특정 간격으로 난수를 생성할 수도 있다.

  • randint
    : randint(a, b)는 a부터 b까지의 정수를 반환한다. (범위 끝 포함)
    (randrange(a, b+1)과 같은 동작을 한다.)

  • choice
    : 주어진 시퀀스(리스트, 문자열 등)에서 무작위로 하나를 선택해 반환한다.

  • random
    : 0 이상 1 미만의 부동소수점 난수(float)를 반환한다.

4.

# 1.리스트로 뽑아낼것
# 2.중복을 제거 할것
# 3.로직 작성시 for 문으로 리스트에서 제공하는 함수등으로 구성할것 
lotto = LottoNum()
print(lotto.get_lotto_nums()) # [1,2,3,4,5,6]

import random

class LottoNum : 
    def __init__(self) : 
        self.lotto_nums = []
    
    def get_lotto_nums(self) : 
        self.lotto_nums = []

        while len(self.lotto_nums) < 6 :     # 중복되지 않는 6개의 숫자를 뽑을 때까지 반복
            rand_nums = random.randint(1,45)
            if rand_nums not in self.lotto_nums :   # 전에 뽑았던 거랑 다른 거 뽑음
                self.lotto_nums.append(rand_nums)

        # 중복 없는 6개를 뽑아서 나왔을 때
        return self.lotto_nums

lotto = LottoNum()
print(lotto.get_lotto_nums())   
# 출력 : [3, 37, 32, 6, 15, 44]
# 결과는 계속 달라짐

5.예외처리 구문을 넣으시오.

def main():
    while True:
        kor = int(input("국어 점수 입력 : "))
        eng = int(input("영어 점수 입력 : "))
        math = int(input("수학 점수 입력 : "))
        
        grade = Grade(kor,eng,math)        

        print("총점 : ",grade.get_total())
        print("평균 : ",grade.get_avg())
        print("학점 : ",grade.get_grade())

        continue_yn = input("계속 하시겠습니까? (y/n) : ")
        #y,yes,Yes,Y,yes
        if continue_yn.upper() != 'Y' and continue_yn.upper() != 'YES' :
            break
    
    print("프로그램 종료")

main()

def main():
    while True:
        while True :    # 제대로 입력 못하면 못 나감
            try : 
                kor = int(input("국어 점수 입력 : "))
                eng = int(input("영어 점수 입력 : "))
                math = int(input("수학 점수 입력 : "))
                break       # 제대로 입력하면 내보내줌
            except ValueError : 
                print("잘못 입력하셨습니다. 다시 입력하세요")

        grade = Grade(kor,eng,math)        
        
        print("총점 : ",grade.get_total())
        print("평균 : ",grade.get_avg())
        print("학점 : ",grade.get_grade())

        continue_yn = input("계속 하시겠습니까? (y/n) : ")
        #y,yes,Yes,Y,yes
        if continue_yn.upper() != 'Y' and continue_yn.upper() != 'YES' :
            break
    
    print("프로그램 종료")

main()

6. 아래의 업다운 게임을 짜시오.

# 예외처리 꼭 부탁드립니다.
# 내용:
# 시도 횟수는 10번으로 정하도록 하겠습니다.
# 플레이어와 컴퓨터가 참여하는 업다운 게임을 만드세요.
# 프로그램은 다음과 같은 기능을 포함해야 합니다.

# 컴퓨터는 1부터 100 사이의 랜덤한 숫자를 생성합니다.
# 플레이어는 숫자를 입력하고, 입력한 숫자와 컴퓨터의 숫자를 비교합니다.
# "업" 또는 "다운" 힌트를 제공합니다.
# 플레이어가 컴퓨터의 숫자를 정확히 맞히면 시도한 횟수를 알려줍니다.
# 플레이어가 숫자를 맞힐 때까지 위 과정을 반복합니다.
# 시도횟수가 10번이 지나면 게임 실패 입니다.

game = UpDownGame()
game.run()

출력 :
91
1~100 사이의 숫자를 입력하세요. 90
UP

1~100 사이의 숫자를 입력하세요. 92
DOWN

1~100 사이의 숫자를 입력하세요. 91
정답입니다.

import random

class UpDownGame : 
    def __init__(self) : 
        self.count = 0
        self.input_num = 0

    def run(self) : 
        self.rand_num = random.randint(1, 100)   # 1~100 난수 
        self.count = 0

        while self.count < 10 :   # 10번까진 도전할 수 있음
            try : 
                self.input_num = int(input(f"{self.count + 1}번째 시도: 1~100 사이의 숫자를 입력하세요 : "))
                
                if not (1 <= self.input_num <= 100) :
                    print("1에서 100 사이의 숫자를 입력해주세요.")
                    continue 

                self.count += 1     # 입력 제대로 했으면 도전 횟수 하나 차감

                if self.rand_num == self.input_num :    # 정답
                    print(f"정답입니다! {self.count}번 만에 맞혔어요!")
                    break
                
                elif self.input_num > self.rand_num : 
                    print("DOWN", flush=True)
                else : 
                    print("UP", flush=True)
            
            except ValueError : 
                print("숫자가 아닌 입력입니다. 1에서 100 사이의 숫자를 입력해주세요.")

        if self.count == 10 :
            print("10번 시도했습니다. 게임에서 졌습니다.", flush=True)   
            print(f"정답은 {self.rand_num}였습니다.", flush=True)


game = UpDownGame()
game.run()

중간중간 print문 안에 flush=True 가 있는데
입력 처리 딜레이 때문에 입력해도 바로 안 뜨고 다음 입력까지 받고 한꺼번에 결과가 출력되는 일이 있어서 출력이 즉시 화면에 반영되도록 한 것이다.

7. 로또 번호를 리스트로 출력하시오.

import random

# 로또 번호 생성
lotto_lst = []

while len(lotto_lst) < 6 : 
    rand_num = random.randint(1, 45)

    if rand_num not in lotto_lst :  # 중복 검사
        lotto_lst.append(rand_num)

print(lotto_lst)

8.가위 바위보 게임을 만드시오.

# 예외처리 꼭 부탁드립니다.
# 가위 바위 보 게임
# 가위 바위 보를 하는 게임 입니다.

game = RSPGame()
game.run()

가위 바위 보 중 하나를 입력하세요: 가위
컴퓨터는 가위를 냈습니다.

플레이어는 가위를 냈습니다.
무승부

계속 하시겠습니까? yes

가위 바위 보 게임
가위 바위 보를 하는 게임 입니다.

가위 바위 보 중 하나를 입력하세요: 가위
컴퓨터는 가위를 냈습니다.

플레이어는 가위를 냈습니다.
무승부

계속 하시겠습니까? no

게임이 끝났습니다.

import random

RSP_inven = ["가위", "바위", "보"]

class RSPGame : 
    def __init__(self) : 
        user_RSP = "미정"
        com_RSP = "미정"

    def run(self) :
        while True : 
            print("가위 바위 보 게임")
            print("가위 바위 보를 하는 게임입니다. \n")

            # 유저 입력
            while True :        
                try:
                    user_RSP = input("가위 바위 보 중 하나를 입력하세요 : ")

                    if user_RSP in RSP_inven :          # 제대로 입력했을 시 다음 단계계
                        break
                
                    print("잘못된 입력입니다. 가위 바위 보 중 하나를 고르세요. \n", flush=True)   # 그렇지 않을 경우 다시 입력
                
                except Exception as msg :
                    print(f"입력 중 오류가 발생했습니다. : {msg} \n")
                    continue
            
            # 컴퓨터 입력
            com_RSP = random.choice(RSP_inven)      # 컴퓨터도 가위 바위 보 중 하나를 고름
            print(f"컴퓨터는 {com_RSP}를 냈습니다")

            # 비교 및 결과 발표
            if user_RSP == com_RSP :        # 비김
                print("무승부입니다.\n")

            elif (user_RSP == "가위" and com_RSP == "보") or (user_RSP == "가위" and com_RSP == "보") or (user_RSP == "가위" and com_RSP == "보") :     # 유저가 이겼을 때
                print("이겼습니다!! 축하합니다!!\n")

            else :  # 유저가 짐
                print("앗... 졌습니다....\n")

             # 게임 반복 여부 확인
            while True:
                try:
                    self.continue_ys = input("게임을 계속 하시겠습니까? (Y/N): ").strip().upper()

                    if self.continue_ys in ["Y", "YES"]:  # 게임 계속
                        print("새로운 라운드를 시작합니다!\n")
                        break
                    elif self.continue_ys in ["N", "NO"]:  # 게임 종료
                        print("게임을 종료합니다. 감사합니다! 🎮\n")
                        return
                    else:
                        print("잘못된 입력입니다. Y 또는 N을 입력해주세요.\n")

                except Exception as msg:
                    print(f"입력 오류가 발생했습니다: {msg}\n")
                    continue

game = RSPGame()
game.run()

9. print(len(t))를 스페셜 메소드로 직접 호출해 보시오.

t = (1,2,3)
print(len(t))
t = (1, 2, 3)

print(len(t))         # 기본 len() 함수 호출
print(t.__len__())    # 스페셜 메소드 __len__() 직접 호출

# 출력값은 둘 다 3으로 같다.

10.아래가 에러가 나는 이유와 에러가 나지 않게 수정하시오.

class Sentence :    
    def __init__(self, s) :        
           self.words = s.split()

s = Sentence("Sometimes bad things happen to good people")


print(len(s))  # TypeError: object of type 'Sentence' has no len()

class Sentence :    
    def __init__(self, s) :        
           self.words = s.split()

    def __len__(self) :
          return len(self.words)  

s = Sentence("Sometimes bad things happen to good people")


print(len(s)) 	# 출력 : 7

11. 아래를 코딩 하시오

c = Car("32러5234")
print(len(c))  #7 = 차량 번호의 길이가 반환됨 
print(str(c))  #  차량번호는 32러5234 입니다

class Car : 
    def __init__(self, s) : 
        self.car_num = s
    
    def __len__(self) : 
        return len(self.car_num)
    
    def __str__(self) : 
        self.result = "차량번호는 " + self.car_num + "입니다."
        return self.result


c = Car("32러5234")
print(len(c))  #7 = 차량 번호의 길이가 반환됨 
print(str(c))  #  차량번호는 32러5234 입니다

12. 아래의 주사위 게임을 짜시오.

# 주사위 게임

dice_game = DiceGame()
dice_game.run()

첫번째의 참가자의 이름을 입력하세요.
영희
두번째의 참가자의 이름을 입력하세요.
철수
영희 주사위 숫자는 : 6
철수 주사위 숫자는 : 5
영희가 이겼습니다.

# 주사위 게임
import random

class DiceGame : 
    def __init__(self) :
        self.user_name1 = ""
        self.user_name2 = ""

        self.dice_num1 = 0
        self.dice_num2 = 0

    def run(self) : 
        while True : 
            try : 
                while True :        # 이름 제대로 입력 못하면 못 나감감
                    self.user_name1 = input("첫번째 참가자 이름을 입력하세요. ")
                    self.user_name2 = input("두번째 참가자 이름을 입력하세요. ")

                    if self.user_name1.strip().isalpha() and self.user_name2.strip().isalpha() :    # 잘 입력함
                        break

                    else : 
                        print("잘못 입력하셨습니다. 다시 입력해주세요. \n")
            
            except ValueError as msg : 
                print(f"잘못 입력하셨습니다. : {msg}")

            # 주사위 던지기기
            self.dice_num1 = random.randint(1, 6)
            self.dice_num2 = random.randint(1, 6)

            # 주사위 출력력
            print(f"{self.user_name1} 주사위 숫자는 : {self.dice_num1}", flush=True)
            print(f"{self.user_name2} 주사위 숫자는 : {self.dice_num2} \n", flush=True)

            if self.dice_num1 > self.dice_num2 : 
                print(f"{self.user_name1}님이 이겼습니다. \n")

            elif self.dice_num2 > self.dice_num1 : 
                print(f"{self.user_name2}님이 이겼습니다. \n")
            
            else : 
                print("둘의 주사위가 같습니다. 비겼습니다. \n")

            self.continue_ys = input("게임을 다시 시작하고 싶으신 경우 y 또는 yes를 입력해주세요. ")
            
            if self.continue_ys.upper() in ["Y", "Yes"] : 
                print("새로운 게임을 시작합니다. \n", flush=True)
                continue
            else : 
                print("게임을 종료합니다.")
                return


        
dice_game = DiceGame()
dice_game.run()

세줄요약:
스페셜 메소드란 __함수명__ 이다.
예외처리 구문은 try except finally 이다.
클래스를 구성시, 데이터타입 리스트,튜플,딕셔러니도 잘 활용해보고, 메서드도 기능별로 나누어서 구성해 보자.

전에는 회고시간에 문제를 다 풀고 간단한 정리까지 할 수 있었는데 오늘은 한 문제를 못 풀었다.
예전보다 문제 푸는 시간이 길어졌다.
전공수업 들었을 때는 클래스에 대한 이해가 부족했던 것 같았는데 이제는 좀 감이 오는 것 같다. (다 안다 x / 전보다는 이해가 잘 된다 o)

오늘 예외처리와 스페셜 메소드, 그리고 클래스와 for, while을 사용한 코딩에 대해 배웠는데 회고 리스트를 정리하면서 복습이 된 것 같다.

어제 class 배울 때 structure가 생각나고 self 배울 때 this가 생각났는데 둘 다 파이썬에서 쓰는 게 아니었다.ㅋㅋㅋㅋㅋ
배웠지만 머리에서 엉켜있나보다....

사진은 오늘 회고 시간이 끝난 후 내 모습을 챗 GPT한테 그려달라고 했다.
예전에 수능 수학 시간 끝나면 머리가 엄청 뜨거웠는데 오늘도 그런 느낌이었다.

0개의 댓글