연습문제를 풀면서 파이썬 기초와 중급 사이에는 크나큰 벽이 있는걸 느꼈습니다 ㅎㅎ...
파일명 main
import reverseStr
# 문자열 받기
userInput = input('문자열 입력 : ')
#모듈안의 함수 기능을 사용하여 뒤집어줌
reverseInput = reverseStr.reverseStr(userInput)
print(reverseInput)
간단히 userInput에 문자열을 입력받고 굳이 외부에 선언된 함수 reverseStr를 reverseStr파일 안에서 불러와 뒤집어 주는 코드를 작성했습니다.
#파일명 reverseStr
def reverseStr(str):
reversedString = ''
for c in str:
reversedString = c + reversedString
return reversedString
str 변수를 받아오면 빈 reversedString 변수에 한글자씩 넣어서 문자열을 뒤집어 준 뒤 return을 통해 내보내주는 함수를 작성해줍니다.
제로베이스 중급강의를 들으면서 가장 많이 나오는 단골 유형이다. 외우도록하자
# 0보다 큰 정수를 입력 받음
num = int(input('0보다 큰 정수 입력 : '))
# 약수와 소수를 저장할 공간을 선언
divisor = []
prime = []
# 1에서 부터 본인까지 하기위해 num+1까지를 범위로 선언해줌
for number in range(1,(num + 1)):
# num을 본인보다 작은 모든 자연수로 나눠주고 이중에 나머지가 0이면 그것은 약수!!
if num % number == 0:
# 이를 append를 통해 딕셔너리에 저장
divisor.append(number)
print(divisor)
# 2에서 부터 본인까지 하기위해 num+1까지를 범위로 선언해줌
for number in range(2, (num + 1)):
flag = True
# 2보다 큰 숫자를 1부터 나눠주는 작업을 수행함
for i in range(2, number):
# 나눠준 값의 나머지가 0이면 그것은 1과 본인을 제외한 다른것으로 나눠진다는 뜻이므로 소수가 아니다!
if number % i == 0:
flag = False
break
# flag가 참이였던 것들을 prime 딕셔너리에 추가해줌
if flag:
prime.append(number)
print(prime)
약수는 생각보다 이론이 간단하지만 소수는 파이썬으로 풀어보라고 하니 뇌정지가 왔으나 한줄한줄 곱씹어보니 이해가 가는 코드였다.
함수 클레스 모듈 예외처리 파이썬 중급에서 배운 내용의 집합체라고 봐도 무방한 문제였다. 풀면서 이해하는데 3시간은 걸린거 같은 문제였다.
# 개인계좌 클래스 생성
class PrivateBank:
# 클래스 초기화 함수
def __init__(self, bank, account_name):
# 은행 이름 저장
self.bank = bank
# 예금주 이름 저장
self.account = account_name
# 계좌번호 생성
while True:
num = random.randint(10000, 99999)
if bank.isAccount(num):
continue
else:
self.account_no = num
break
# 총 예금액 초기화
self.totalMoney = 0
# 은행에 계좌 추가
bank.addAccount(self)
# 계좌 정보 출력 함수
def printBankInfo(self):
print(f'예금주: {self.account}')
print(f'계좌번호: {self.account_no}')
print(f'총 예금액: {self.totalMoney}')
# 은행 클래스 생성
class Bank:
# 클래스 초기화 함수
def __init__(self):
# 계좌 정보 저장 딕셔너리
self.accounts = {}
# 계좌 추가 함수
def addAccount(self, privateBank):
# 계좌번호를 키로, 계좌 정보를 값으로 하는 딕셔너리에 계좌 추가
self.accounts[privateBank.account_no] = privateBank
# 계좌 존재 여부 확인 함수
def isAccount(self, ano):
# 딕셔너리에 계좌번호가 존재하면 True, 아니면 False 반환
return ano in self.accounts
# 입금 함수
def doDeposit(self, ano, m):
# 계좌번호에 해당하는 계좌 정보 가져오기
pb = self.accounts[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)
# 계좌 정보 출력
myAccount.printBankInfo()
# 메뉴 선택
while True:
selectNum = int(input('1.입금, 2.출금, 3.종료'))
if selectNum == 1:
# 입금액 입력 받기
m = int(input('입금액 입력: '))
# 입금
koreaBank.doDeposit(myAccount.account_no, m)
# 계좌 정보 출력
myAccount.printBankInfo()
elif selectNum == 2:
# 출금액 입력 받기
m = int(input('출금액 입력: '))
try:
# 출금
koreaBank.doWithdraw(myAccount.account_no, m)
except bank.LackException as e:
# 예금액 부족 예외 발생 시 예외 메시지 출력
print(e)
finally:
# 계좌 정보 출력
myAccount.printBankInfo()
elif selectNum == 3:
print('Bye~')
break
else:
print('잘못 입력 하셨습니다.')
위에서 생성한 은행계좌와 입출금 기능들을 사용하였고 while문으로 선택지를 제시해 기능을 사용할수있도록 한다.