try ~ except~ finally~
파이썬에서 예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 안전하게 처리하여 프로그램이 중단되지 않도록 하는 기능이다.
(강사님은 파이썬은 에러 발생 시 "즉사"라고 말씀하셨다.ㅋㅋㅋㅋㅋ)
try
: 예외가 발생할 수 있는 코드를 작성한다.
except
: try 블록에서 발생한 예외를 처리한다.
: 모든 예외를 처리할수도 있고 예외 유형을 명시하여 특정 예외를 처리할수도 있다.
finally
: 예외 발생 여부와 상관없이 항상 실행되는 코드이다.
: try 블록에서 예외가 발생하지 않아도 finally가 실행되고
: try 블록에서 예외가 발생해도 except 블록 실행 후 finally 블록이 실행된다.
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)를 반환한다.
# 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]
# 결과는 계속 달라짐
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()
# 예외처리 꼭 부탁드립니다.
# 내용:
# 시도 횟수는 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 가 있는데
입력 처리 딜레이 때문에 입력해도 바로 안 뜨고 다음 입력까지 받고 한꺼번에 결과가 출력되는 일이 있어서 출력이 즉시 화면에 반영되도록 한 것이다.
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)
# 예외처리 꼭 부탁드립니다.
# 가위 바위 보 게임
# 가위 바위 보를 하는 게임 입니다.
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()
t = (1,2,3)
print(len(t))
t = (1, 2, 3)
print(len(t)) # 기본 len() 함수 호출
print(t.__len__()) # 스페셜 메소드 __len__() 직접 호출
# 출력값은 둘 다 3으로 같다.
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
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 입니다
# 주사위 게임
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한테 그려달라고 했다.
예전에 수능 수학 시간 끝나면 머리가 엄청 뜨거웠는데 오늘도 그런 느낌이었다.
