📗 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일차 후기
연습문제 하나하나 직접 풀어보고 해설을 들으려 하다보니 시간이 오래걸렸다.
예외 처리가 개념을 배우면서 헷갈렸던 부분이 있었는데, 연습문제를 푸니 조금씩 이해가 갔다.
내가 푼 코드와 해설의 코드가 다른 경우가 있는데, 그렇다면 해설의 코드 처럼 작성하는 게 좋다고 생각해야 되는 건가 아니면 내가 작성한 것도 제대로 작동되니 괜찮다고 봐야하는 건가 하는 것이 궁금했다.
※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.
'제로베이스 데이터 스쿨 > 일일 스터디 노트' 카테고리의 다른 글
11일차 스터디노트 / 기초수학 등비수열, 시그마, 계차수열, 피보나치수열, 군수열 + 파이썬/ 제로베이스 데이터취업스쿨 (1) | 2023.01.15 |
---|---|
10일차 스터디노트 / 기초수학 약수와 소수, 최소공배수와 최소공약수, 진법, 등차수열 + 파이썬 / 제로베이스 데이터 취업스쿨 (1) | 2023.01.14 |
8일차 스터디노트 / 파이썬 모듈, 클래스 연습문제 풀이 / 제로베이스 데이터 취업 스쿨 (0) | 2023.01.12 |
7일차 스터디노트 / 파이썬 텍스트 파일 쓰기, 읽기, 함수 연습문제 풀이/제로베이스 데이터 취업스쿨 (0) | 2023.01.11 |
6일차 스터디노트/ 파이썬 객체 지향 프로그래밍, 클래스, 예외 / 제로베이스 데이터 취업스쿨 (0) | 2023.01.09 |