제로베이스 데이터 취업 스쿨 과정 학습 내용을 정리한 포스팅입니다.

 

📍 한/영 사전 프로그래밍

from abc import ABCMeta
from abc import abstractmethod

class AbsDictionary(metaclass=ABCMeta):
    
    def __init__(self):
        self.wordDict = {}
    
    @abstractmethod
    def registWord(self, w1, w2):
        pass
    
    @abstractmethod
    def removeWord(self, w1):
        pass

    @abstractmethod
    def updateWord(self, w1, w2):
        pass

    @abstractmethod
    def searchWord(self, w1):
        pass

먼저 한/영, 영/한 등 사전을 만드는 상위 클래스를 만들어주고, 추상클래스로 구현하여 구체적인 하위 클래스 사전에서 메소드를 만들도록 강제한다.

 

class KorToEng(AbsDictionary): # 상위 클래스 상속받기

    def __init__(self):
        super().__init__()

    def registWord(self, w1, w2):
        print(f'단어 등록 / {w1} : {w2} ')
        self.wordDict[w1] = w2

    def removeWord(self, w1):
        print(f'단어 제거 / {w1}')
        del self.wordDict[w1]

    def updateWord(self, w1, w2):
        print(f'단어 변경 / {w1} : {w2} ')
        self.wordDict[w1] = w2

    def searchWord(self, w1):
        print(f'단어 검색 / {w1} : {self.wordDict[w1]}')

    
    def printWord(self):
        for i in self.wordDict:
            print(f'{i} -> {self.wordDict[i]}')

상위 추상클래스를 상속 받아 구체적으로 메소드를 구현한다.

 

import ADictionary as ad # 다른 실행 파일에서 위의 클래스가 저장된 Adictionary.py를 불러온다

kte = ad.KorToEng()

kte.registWord('책', 'bok')
kte.registWord('나비', 'butterfly')
kte.registWord('연필', 'pencil')
kte.registWord('학생', 'studen')
kte.registWord('선생님', 'teacher')

kte.printWord()

kte.updateWord('책', 'book')
kte.searchWord('책')

kte.removeWord('책')

kte.printWord()

 

이와 같은 방식으로 한영 사전 KorToEng() 클래스를 불러와 kte 인스턴스를 선언한다.

KorToEng 클래스에 구현해 놓은 메소드들을 이용할 수 있게 된다.

 


📍 소수 판별기 프로그래밍

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

class PrimeException(Exception):

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

NotPrimeException : 소수가 아니라고 표현하는 (exception 발생시키는 X) 클래스 정의

PrimeException : 소수라고 표현하는 (exception 발생시키는 X) 클래스 정의

 

 

 

def isPrime(number):
    flag = True
    for i in range(2, number):
        if number % i == 0:
            flag = False
            break
    

    if flag == True:
        raise PrimeException(number)
    else:
        raise NotPrimeException(number)

isPrime 함수 : 숫자가 소수인지 판별하고, 맞다면 PrimeException을, 아니라면 NotPrimeException을 발생(raise)시키는 기능

 

 

import Primecheck as pc
import random


prime_nums = []

n = 0
while n < 10:
    rn = random.randint(2, 1000)
    
    if rn not in prime_nums:
        try:
            pc.isPrime(rn)
        
        except pc.PrimeException as e:
            print(e)
            prime_nums.append(rn)
        
        except pc.NotPrimeException as e:
            print(e)
            continue

    else:
        print(f'{rn} is already in')
        continue

    n += 1

print(prime_nums)

소수를 확인하는 primecheck.py를 불러오기

 

2 ~ 1000 의 난수가 소수면 PrimeException이 발생하고 리스트에 추가, 소수가 아니면 NotPrimeException이 발생하고 다시 iter를 실행하는 반복문 작성

 


📍 상품 총 구매금액 계산하기 프로그래밍

g1price = 1200; g2price = 1000; g3price = 800
g4price = 2000; g5price = 900

def calculate(*gcs):

    gcsDic = {}
    againCntInput = {}

    for idx, gc in enumerate(gcs):
        try:
            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:
        totalPrice += globals()[f'{g}price'] * gcsDic[g]
    totalPrice = format(totalPrice, ',')

    print(f'총 구매금액 : {totalPrice}원')

    print(f'미결제 항목')
    for g in againCntInput:
        print(f'상품: {g}, 구매 개수: {againCntInput[g]}')

상품금액 x 구매 개수로 총 구매금액을 구하는데, 개수로 숫자가 아닌 값이 입력되면 예외처리

 

* globals() : 변수 = 값으로 선언된 모든 것을 딕셔너리로 반환해주는 함수

 

 

 

import goods as gd

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

gd.calculate(g1Cnt, g2Cnt, g3Cnt, g4Cnt, g5Cnt)

 

제로베이스 데이터 취업 스쿨 과정 학습 내용을 정리한 포스팅입니다.

 

📍 예외 처리

예외: 문법적인 문제는 없으나 실행 중 발생하는 예상하지 못한 문제

 

n1 = 10
n2 = 0

print(n1 / n2) # 문법적 오류는 없으나 0으로 나누는 건 문제 상황이다.

=> 예외 발생: ZeroDivisionError: division by zero


📍 try ~ except

의도한 부분을 try 하고, 오류가 발생할 경우에도 error 발생으로 이후 스크립트가 멈추지 않고 except 이하가 실행되도록 한다.

 

n1 = 10; n2 = 0

try:
    print(n1 / n2)
except:
    n2 += 0.01
    print(n1 / n2)

=> 분모가 0인 오류 상황인데도 에러 발생으로 멈추지 않고, except에서 값을 수정하여 예외 상황에서의 실행으로 이어진다.


📍 try ~ except ~else

예외가 발생하지 않은 경우, else 이하를 실행하도록 한다.

 

n1 = 10; n2 = 1

try:
    print(n1 / n2)
except:
    n2 += 0.01
    print(n1 / n2)
else:
     print("예외 없이 실행되었습니다") # 출력

📍 finally

예외 발생 여부와 관계없이 항상 실행하도록 한다.

n1 = 10; n2 = 1

try:
    print(n1 / n2)
except:
    n2 += 0.01
    print(n1 / n2)
else:
    print("예외 없이 실행되었습니다") # 출력

finally:
    print("모든 작업이 끝났습니다) # 출력

📍 Exception 클래스

Exception 클래스로 예외 상황에서의 에러 메시지를 확인할 수 있다.

n1 = 10; n2 = 1

try:
    print(n1 / n2)
except Exception as e:
    print(f"예외 발생 : {e}")
    n2 += 0.01
    print(n1 / n2)

=> division by zero 출력

 

 

raise를 이용해 강제로 예외를 발생시킬 수 있다.

def sendSMS(msg):
    if len(msg) > 10:
        raise Exception("길이초과! MMS 전환 후 발송", 1)
    else:
        print("SMS 발송!")
        
def sendMMS(msg):
    if len(msg) <= 10:
        raise Exception("길이미달! SMS 전환 후 발송", 2)
    else:
        print("MMS 발송!")
        
 
 msg = "1234567891011"
 
 try:
     sendSMS(msg)
     
 except Exception as e:
     if e.args[1] == 1:
         sendMMS(msg)
     elif e.args[1] == 2:
         sendSMS(msg)

 

📍 파일 열기, 읽기, 쓰기

with ~ as 문을 이용하여 파일을 열고, 읽고, 쓸 수 있다.

 

with open("content/text.txt", 'r') as f: # 읽기
    print(f.read())
    
with open("content/text.txt", 'w') as f: # 쓰기, 이미 있다면 새로 덮어쓴다.
    f.write("안녕하세요.")

with open("content/text.txt", 'a') as f: # 쓰기, 이어서 쓴다.
    f.write("반갑습니다.")

 

📍 writelines()

여러 데이터를 포함한 자료형을 쓸 때 사용

alpha = ['a', 'b', 'c', 'd']

with open('contents/text.txt', 'a') as f:
    f.writelines(alpha)

 

📍 readlines()

파일의 모든 데이터를 읽어서 리스트 형태로 반환

 

with open('contents/text.txt', 'r') as f:
    alpha_lst = f.readlines()

 

+ Recent posts