본문 바로가기
제로베이스 데이터 스쿨/일일 스터디 노트

9일차 스터디노트 / 파이썬 예외, 텍스트 파일 연습문제 풀이 / 제로베이스 데이터 취업스쿨

by 김뎀뎀 2023. 1. 14.

📗 9일차 공부 내용 요약

[파이썬]

1. 예외 연습문제 풀이 : 예외 처리와 관련된 연습문제를 풀었다

2. 텍스트파일 연습문제 풀이 : 텍스트파일을 생성하고, 쓰고, 읽는 것과 관련된 연습문제를 풀었다

 


📖  9일차 공부 내용 자세히

1. 예외 연습문제 풀이

※ 기억에 남는 문제 위주로 기재해본다

Q. 상품 구매에 따른 총 구매 금액을 출력하되, 개수가 잘못 입력된 경우 별도로 출력하도록 프로그램을 만들어보자.
#모듈
g1Price = 1200; g2Price = 1000 ; g3Price = 800;
g4Price = 2000; g5Price = 900

def calculator(*gcs):

    gcsDic = {} #잘 입력
    againCntInput = {} #잘못 입력

    for idx,gc in enumerate(gcs):
        try:
            gcsDic[f'g{idx+1}'] = int(gc) #딕셔너리에 키로 상품명( g + 인덱스번호+1)과 밸류로 개수를 넣음
        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('-----------------------------------')
    print(f'총 구매 금액 : {totalPrice}원')
    print('------------미결제 항목--------------')
    for g in againCntInput.keys():
        print(f'상품: {g},\t 구매 개수: {againCntInput[g]}')
    print('-----------------------------------')

#실행
import calculatorPurchase as cp

g1cnt = input('goods1 구매 개수:')
g2cnt = input('goods1 구매 개수:')
g3cnt = input('goods1 구매 개수:')
g4cnt = input('goods1 구매 개수:')
g5cnt = input('goods1 구매 개수:')

cp.calculator(g1cnt,g2cnt,g3cnt,g4cnt,g5cnt)

 

Q. 회원가입 프로그램을 만들되 입력하지 않은 항목이 있는 경우 에러 메시지를 출력하는 프로그램을 만들어보자.
#모듈
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')

    if m == '':
        raise  EmptyDataException('mail')

    if p == '':
        raise  EmptyDataException('password')

    if a == '':
        raise  EmptyDataException('address')

    if ph == '':
        raise  EmptyDataException('phone')


class RegistMember:

    def __init__(self, n, m, p, a, ph):
        self.m_name = n
        self.m_mail = m
        self.m_password = p
        self.m_address = a
        self.m_phone = ph
        print('Membership completed!')

    def printMember(self):
        print(f'm_name : {self.m_name}')
        print(f'm_mail : {self.m_name}')
        print(f'm_password : {self.m_password}')
        print(f'm_address : {self.m_address}')
        print(f'm_phone : {self.m_phone}')

#실행
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)
    newMembers = mem.RegistMember(m_name,m_mail,m_pw,m_addr,m_phone)
    newMembers.printMember()
except mem.EmptyDataException as e:
    print(e)

 

Q.은행 계좌 개설 및 입/출금 프로그램을 만들어보자.
#모듈
#은행의 클래스와, 개인 통장의 클래스를 따로 생성하는 게 핵심이다

import random

class PrivateBank:

    def __init__(self, bank, account_name):
        self.bank = bank #Bank 클래스로 생성한 은행의 객체가 들어온다.
        self.account_name = account_name

        while True:
            newAccountNo = random.randint(10000,99999)
            if bank.isAccount(newAccountNo): #계좌번호가 은행에 이미 있는지 확인, Bank의 기능 활용
                continue #있다면, 다시 반복
            else:
                self.account_no = newAccountNo
                break

        self.totalMoney = 0
        bank.addAccount(self) #은행에 PrivatteBank 객체를 넣어준다

    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 #계좌번호를 key값으로 하여 계좌 정보 전체를 저장

    def isAccount(self, ano): #계좌번호를 통해, 해당 계좌가 은행에 있는지 확인
        return ano in self.accounts #있다면 트루값 반환

    def doDeposit(self, ano, m): #입금하기
        pb = self.accounts[ano] #ano(계좌번호)를 통해 해당하는 개인 계좌 정보를 변수에 할당
        pb.totalMoney = pb.totalMoney + m #잔액 증가

    def doWithDraw(self, ano, m): #출금하기
        pb = self.accounts[ano]
        if pb.totalMoney - m < 0 : #잔액보다 출금액이 크면 에러 발생
            raise LackException(pb.totalMoney,m)
        pb.totalMoney = pb.totalMoney - m #에러가 발생하지 않으면 잔액에서 출금액 차감


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

#실행
import bank

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

new_account_name = input('통장 개설을 위한 예금주 입력:')
myAccount = bank.PrivateBank(koreaBank, new_account_name) #k내 계좌 객체 생성, kor은행 객체 딕셔너리에 내 계좌 정보 추가
myAccount.printBankInfo()

while True:

    selectNUmber = int(input('1.입금 \t 2.출금 \t 3.종료'))
    if selectNUmber == 1:
        m = int(input('입금액 입력 : '))
        koreaBank.doDeposit(myAccount.account_no, m) #kor은행 딕셔너리에 있는 내 계좌에 입금(토탈머니 증대)
        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('Bye~')
        break

    else:
        print('잘못 입력했습니다')

 

2. 텍스트파일 연습문제 풀이

※ 기억에 남는 문제 위주로 기재해본다

Q.텍스트 파일에 수입과 지출을 기록하는 가계부를 만들어보자.
#풀이
import time
def getTime():
    lt = time.localtime()
    st = time.strftime('%Y-%m-%d %H:%M:%S')
    return st

while True:

    selectNumber = int(input('1.입금  2.출금  3.종료'))

    if selectNumber == 1:
        money = int(input('입금액 입력 : '))
        with open('C:/pythonTxt/bank/money.txt','r') as f: #잔고만 관리하는 텍스트파일에서 잔고를 불러옴
            m = f.read()

        with open('C:/pythonTxt/bank/money.txt','w') as f: #잔고 관리 파일에 입금액을 더함
            f.write(str(int(m) + money)) #기존 잔고를 인수로 캐스팅 후 입금액을 더하고 다시 문자열로 캐스팅

        memo = input('입금 내역 입력 : ')
        with open('C:/pythonTxt/bank/pocketMoneyRegister.txt','a') as f:
            f.write('-----------------------------\n')
            f.write(f'{getTime()}\n')
            f.write(f'[입금] {memo} : {str(money)}원 \n')
            f.write(f'[잔액] {str(int(m) + money)}원 \n')

        print('입금 완료!')
        print(f'기존 잔액 : {m}')
        print(f'입금 후 잔액 : {int(m) + money}')

    if selectNumber == 2:
        money = int(input('출금액 입력 : '))
        with open('C:/pythonTxt/bank/money.txt','r') as f:
            m = f.read()

        with open('C:/pythonTxt/bank/moeny.txt','w') as f:
            f.write(str(int(m) - money))

        memo = input('출금 내역 입력 : ')
        with open('C:/pythonTxt/bank/pocketMoneyRegister.txt','a') as f:
            f.write('-----------------------------\n')
            f.write(f'{getTime()}\n')
            f.write(f'[출금] {memo} : {str(money)}원 \n')
            f.write(f'[잔액] {str(int(m) - money)}원 \n')

        print('출금 완료!')
        print(f'기존 잔액 : {m}')
        print(f'출금 후 잔액 : {int(m) - money}')

    elif selectNumber == 3:
        print('Bye~')
        break

➰ 9일차 후기

연습문제 하나하나 직접 풀어보고 해설을 들으려 하다보니 시간이 오래걸렸다.

예외 처리가 개념을 배우면서 헷갈렸던 부분이 있었는데, 연습문제를 푸니 조금씩 이해가 갔다.

내가 푼 코드와 해설의 코드가 다른 경우가 있는데, 그렇다면 해설의 코드 처럼 작성하는 게 좋다고 생각해야 되는 건가 아니면 내가 작성한 것도 제대로 작동되니 괜찮다고 봐야하는 건가 하는 것이 궁금했다.

 


※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.