Day19. 파이썬 중급문풀 (5~7)

Junghwan Park·2023년 4월 30일
0

스터디노트

목록 보기
20/54

[연습문제] 예외처리(01)

-사용자가 입력한 숫자를 이용해서 산술연산 결과를 출력하는 모듈을 만들되,
예상하는 예외에 대한 예외처리 코드를 작성해 보자.

사용자가 0 또는 공백을 입력한 경우의 예외를 처리해 본다

실행파일

import calculator as cc

num1 = input('첫 번째 피연산자 입력 : ')
num2 = input('두 번째 피연산자 입력 : ')

cc.exp(num1, num2)

모듈파일

def add(n1, n2):
    print('덧셈 연산')
    try:
        n1 = float(n1)  # n1으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return      # return을 안해주면 무한반복으로 오류가 난다!!

    try:
        n2 = float(n2)  # n2으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return

    print(f'{n1} + {n2} = {n1 + n2}')


def sub(n1, n2):
    print('뺄셈 연산')
    try:
        n1 = float(n1)  # n1으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return

    try:
        n2 = float(n2)  # n2으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return

    print(f'{n1} - {n2} = {n1 - n2}')


def mul(n1, n2):
    print('곱셈 연산')
    try:
        n1 = float(n1)  # n1으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return

    try:
        n2 = float(n2)  # n2으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return

    print(f'{n1} * {n2} = {n1 * n2}')


# 나눗셈은 0인 경우도 예외 생각!!
def div(n1, n2):
    print('나눗셈 연산')
    try:
        n1 = float(n1)  # n1으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return

    try:
        n2 = float(n2)  # n2으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return

    # if n2 == 0: # 두 번째 연산자만 0이 아니면 오류가 없다!!
    #     print('0으로 나눌 수 없습니다.')
    #     return

    try:
        print(f'{n1} / {n2} = {n1 / n2}')
    except ZeroDivisionError as e:
        print(e)
        print('0으로 나눌 수 없습니다.')

def mod(n1, n2):
    print('나머지 연산')
    try:
        n1 = float(n1)  # n1으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return

    try:
        n2 = float(n2)  # n2으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return

    # if n2 == 0: # 두 번째 연산자만 0이 아니면 오류가 없다!!
    #     print('0으로 나눌 수 없습니다.')
    #     return

    try:
        print(f'{n1} % {n2} = {n1 % n2}')
    except ZeroDivisionError as e:
        print(e)
        print('0으로 나눌 수 없습니다.')

def flo(n1, n2):
    print('몫 연산')
    try:
        n1 = float(n1)  # n1으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return

    try:
        n2 = float(n2)  # n2으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return

    # if n2 == 0: # 두 번째 연산자만 0이 아니면 오류가 없다!!
    #     print('0으로 나눌 수 없습니다.')
    #     return

    try:
        print(f'{n1} // {n2} = {n1 // n2}')
    except ZeroDivisionError as e:
        print(e)
        print('0으로 나눌 수 없습니다.')

def exp(n1, n2):
    print('거듭제곱 연산')
    try:
        n1 = float(n1)  # n1으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('첫 번째 피연산자는 숫자가 아닙니다.')
        return

    try:
        n2 = float(n2)  # n2으로 문자가 들어오면 에러가 발생할 것이다
    except:
        print('두 번째 피연산자는 숫자가 아닙니다.')
        return

    # if n2 == 0: # 두 번째 연산자만 0이 아니면 오류가 없다!!
    #     print('0으로 나눌 수 없습니다.')
    #     return

    print(f'{n1} ** {n2} = {n1 ** n2}')

[연습문제] 예외처리(02)

-1부터 1000까지의 소수인 난수 10개를 생성하되,
소수가 아니면 사용자가 예외가 발생하도록 프로그램을 만들어보자.

실행파일

# 난수 발생
import random
import prime_module as pm

primeNumbers = []   # 소수만 10개를 저장

n = 0

while n < 10:

    rn = random.randint(2, 1000)    # 1은 소수가 아니므로 2부터!!
    if rn not in primeNumbers:  # 중복 체크

        try:
            pm.isPrime(rn)
        except pm.NoPrimeException as e:
            print(e)
            continue

        except pm.PrimeException as e:
            print(e)
            primeNumbers.append(rn)

    else:
        print(f'{rn} is overlap number')
        continue

    n += 1

print(f'primeNumbers : {primeNumbers}')

모듈파일

class NoPrimeException(Exception): # 소수가 아닌경우 발생하는 예외

    def __init__(self, n):
        super().__init__(f'{n} is not prime number.')

class PrimeException(Exception):

    def __init__(self, n):
        super().__init__(f'{n} is prime number.')

def isPrime(number):    # 소수인지 구분하는 함수
    flag = True
    for n in range(2, number):  # 소수인지 찾는 것이니까 2부터
        if number % n == 0:
            flag = False
            break

    if flag == False:   # 소수가 아닌 경우
        raise NoPrimeException(number)
    else:
        raise PrimeException(number)

[연습문제] 예외처리(03)

-상품 구매에 따른 '총 구매 금액'을 출력하되, 다음과 같이 개수가 잘 못 입력된 경우
별도로 출력하도록 프로그램을 만들어보자.

어렵게 느껴졌다 꼭 복습할 것!

실행파일

import calculatorPurchase as cp

g1Cnt = input('goods1 구매 개수 : ')
g2Cnt = input('goods2 구매 개수 : ')
g3Cnt = input('goods3 구매 개수 : ')
g4Cnt = input('goods4 구매 개수 : ')
g5Cnt = input('goods5 구매 개수 : ')

cp.calculator(g1Cnt, g2Cnt, g3Cnt, g4Cnt, g5Cnt)

모듈파일

g1Price = 1200; g2Price = 1000; g3Price = 800;
g4Price = 2000; g5Price = 900

def foramtedNumber(n):
    return format(n, ',')
def calculator(*gcs):    # 총 금액

    gcsDic = {} # 개수가 정상적으로 입력된 목록
    againCntInput = {}

    for idx, gc in enumerate(gcs):
        try:    # 사용자가 입력한 gc가 숫자로 바꾸는데 오류가 있다면 예외!
            gcsDic[f'g{idx + 1}'] = int(gc)

        except Exception as e:
            againCntInput[f'g{idx + 1}'] = gc
            print(e)

    totalPrice = 0
    for g in gcsDic.keys():
        totalPrice += globals()[f'{g}Price'] * gcsDic[g]    # globals 사용법!!

    print('-' * 30)
    print(f'총 구매 금액 : {foramtedNumber(totalPrice)}원')
    print('--------- 미결제 항목 ---------')
    for g in againCntInput.keys():
        print(f'상품 : {g}, \t 구매 개수 : {againCntInput[g]}')

[연습문제] 예외처리(04)

-회원가입 프로그램을 만들되 입력하지 않은 항목이 있는 경우 에러 메시지를 출력하는 프로그램을 만들어보자.

실행파일

# 이러한 기능을 유효성 체크라고 한다!

import mem

m_name = input('이름 입력 : ')
m_mail = input('메일 주소 입력 : ')
m_pw = input('비밀번호 입력 : ')
m_addr = input('주소 입력 : ')
m_phone = input('연락처 입력 : ')

try:
    mem.checkInputData(m_name, m_mail, m_pw, m_addr, m_phone)
    newMember = mem.RegistMember(m_name, m_mail, m_pw, m_addr, m_phone)
    newMember.printMemberInfo()
except mem.EmptyDataException as e:
    print(e)

모듈파일

class EmptyDataException(Exception):    # 오류가 나면 이 함수를 발생 시킨다!

    def __init__(self, i):
        super().__init__(f'{i} is empty!')

def checkInputData(n, m, p, a, ph):

    if n == '':
        raise EmptyDataException('name')
    elif m == '':
        raise EmptyDataException('mail')
    elif p == '':
        raise EmptyDataException('password')
    elif a == '':
        raise EmptyDataException('address')
    elif ph == '':
        raise EmptyDataException('phone')


class RegistMember():   # 회원가입

    def __init__(self, n, m, p, a, ph):
        self.m_name = n
        self.m_mail = m
        self.m_pw = p
        self.m_addr = a
        self.m_phone = ph
        print('Membership complete!!')

    def printMemberInfo(self):
        print(f'm_name : {self.m_name}')
        print(f'm_name : {self.m_mail}')
        print(f'm_name : {self.m_pw}')
        print(f'm_name : {self.m_addr}')
        print(f'm_name : {self.m_phone}')

[연습문제] 예외처리(05)

-다음과 같은 은행 계좌 개설 및 입/출금 프로그램을 만들어 보자.

실행파일

import bank

koreaBank = bank.Bank() # 가상의 은행 생성

new_account_name = input('통장 개설을 위한 예금주 입력 : ')
myAccount = bank.PrivateBank(koreaBank, new_account_name)   # 개인 계좌
myAccount.printBankInfo()   # 개설 확인

while True:

    selectNumber = int(input('1.입금, \t 2.출금, \t 3.종료'))
    if selectNumber == 1:
        m = int(input('입금액 입력 : '))
        koreaBank.doDeposit(myAccount, m)   # 계좌번호, 입금액
        myAccount.printBankInfo()

    elif selectNumber == 2:
        m = int(input('출금액 입력 : '))
        try:
            koreaBank.doWithdraw(myAccount.account_no, m)
        except bank.LackException as e:
            print(e)

        finally:
            myAccount.printBankInfo()

    elif selectNumber == 3:
        print('이용 종료')
        break

    else:   # 1,2,3이 아닌 다른 수를 입력한 경우
        print('잘 못 입력했습니다. 다시 입력하세요.')

# 오류 발생!!

모듈파일

import random

class PrivateBank:

    def __init__(self, bank, account_name,):    # 어느 은행, 통장 정보
        self.bank = bank
        self.account_name = account_name

        while True:
            newAccountNo = random.randint(10000, 99999)
            if bank.isAccount(newAccountNo):    # 중복이면
                continue
            else:
                self.account_no = newAccountNo
                break

        self.totalMoney = 0
        bank.addAccount(self)

    def printBankInfo(self):
        print('-' * 40)
        print(f'account_name : {self.account_name}')
        print(f'account_no : {self.account_no}')
        print(f'totalMoney : {self.totalMoney}')
        print('-' * 40)

class Bank:

    def __init__(self):
        self.accounts = {}  # 계좌번호

    def addAccount(self, privateBank):  # 개인계좌
        self.accounts[privateBank.account_no] = privateBank  # 개인계좌의 키값의 밸류 개인계좌

    def isAccount(self, ano):   # 신규계좌를 만들때 기존에 계좌가 있는지 확인
        return ano in self.accounts

    def doDeposit(self, ano, m):    # 입금    ano 계좌번호, m 금액
        pb = self.accounts[ano]
        pb.totalMoney = pb.totalMoney + m

    def doWithdraw(self, ano, m):   # 출금    ano 계좌번호, m 금액(출금 할)
        pb = self.accounts[ano]
        if pb.totalMoney - m < 0:   # 출금하려는 금액이 0보다 작을 때 예외!
            raise LackException(pb.totalMoney, m)   # 잔고, 출금액
        pb.totalMoney = pb.totalMoney - m

class LackException(Exception):
    def __init__(self, m1, m2): # 잔고, 출금하려는 금액
        super.__init__(f'잔고 부족!!, 잔액: {m1}, 출금액 : {m2}')

아직 오류를 해결하지 못했다 다시 해볼 것

이 글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었습니다.


profile
안녕하세요 반갑습니다^^

0개의 댓글