25. 05. 13 공부일지

behumble·2025년 5월 12일

공부일지

목록 보기
13/20

회고

  • 어느덧 파이썬의 마지막으로 달려가고 있다. 내일이면 파이썬에 관한 모든 내용이 끝난다고 한다. 진짜 실화인가 믿고싶지않다. 파이썬에 대한 이해도가 어느정도 올라오고 코드와 익숙해졌다. 하지만 아직 읽을수는 있으나 100% 쓰지는 못한다. 짧은 기간동안 배운만큼 많이 까먹고 실수할것이다. 앞으로도 파이썬 공부를 계속 해나가야겠다.

Key_point

✅ 클래스 상속

  • 상속을 통해 코드재사용, 유지보수 용이, 확장성이 향상된다.
    -- 사용법 : 자녀클래스(부모클래스)
  • 파이썬은 부모상속자를 호출하는 방식으로 설계해야 한다.
  • 다중 상속을 허용한다.(메소드명이 동일한 경우 앞에거를 호출한다.)

✅다이아몬드 상속

  • 다중상속의 문제점 중 하나
  • 파이썬은 MRO(Method Resolutin Order)를 활용해 메서드의 사용 순서를 정함

✅ try ~ except ~ fianlly 예외처리

  • try: 예외가 발생할 가능성이 있는 코드
  • except : 예외 발생 시 실행되는 코드
  • finally : 예외 발생 여부과 관계없이 실행되는 코드
  • 예외처리의 장점
    -- 프로그램의 중단 방지 : 예외가 발생해도 프로그램이 중단되지 않고 계속 실행
    -- 에러처리 : 친절한 안내를 통해 놀라지 않게함

✅ 표준라이브러리

  • 말 그대로 정보를 찾아보는 도서관
  • 라이브러리를 사용하면 편한 경우가 많으니 많이쓰는 라이브러리의 경우 기억하는 것이 좋다.

필기

클래스상속

  • 상속 : class Child(Base)의 형식으로 ()안에 클래스를 넣어 상속
class Base: #부모 클래스
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
        print("Base 생성자")
    
    def display(self):
        print(f"x = {self.x}, y = {self.y}")
        
    def add(self):
        return self.x + self.y
    
    def doubleX(self):
        return self.x * 2
    
    def doubleY(self):
        return self.y * 2
    
#다형성 :overloading : 동일 클래스내에서 함수의 이름이 같지만 형태가 다른 함수를 만들 수 있는 성격
#                      def myadd(x,y)   def(myadd(x,y,z)
#                      파이썬은 오버로딩을 허용하지 않는다.
#                      대신에 매개변수 기본값이라는 것을 통해서 유사한 결과를 가져온다.
#                      def myadd(x = 1, y = 2, z = 3) myadd(), myadd(10), myadd(10,20)
#       overriding : 부모클래스와 자식클래스간에 벌어진다.
#                    부모클래스에 있는 메서드가 마음에 안들어서 고쳐쓰기를 원할 때,
#                    부모클래스의 함수 이름과 자식 클래스 함수 이름이 같으면 부모의 함수를 가려버린다.
#                    doubleX 특정 변수에 종속되기 때문에 따로 오버라이딩을 하지 않는다.

class Child(Base) : #Base 클래스를 상속 받음.
    def __init__(self, x = 0, y = 0, z = 0):
        #self.x = x
        #self.y = y
        #super() - 부모객체를 가져옴.
        super().__init__(x,y) #부모생성자 호출
        self.z = z
        print("Child1 생성자")
        
        #다른 언어의 경우에는 부모생성자 먼저 호출하고 자식생성자를 호출함.
        #그런데 파이썬은 아님.
        #부모생성자를 호출하는 방식으로 설계하는것이 바람직하다.
    def display(self):
        #super() 부모클래스의 함수를 먼저 호출하고 내가 만든 코드를 붙이고자 할 때
        #==> super().함수명
        print(f"x = {self.x}, y = {self.y}, z = {self.z}")
        return
        
p = Base()
p.display()

p = Base(4,5)
p.display()

c1 = Child(1,2,3)
c1.display()
print(c1.doubleX())
print(c1.doubleY())

#파이썬은 다중상속을 허용한다. 클래스를 동시에 여러개 상속받는 경우
# A -> B -> C 중첩상속 : 모든언어가 이 구조는 허용한다.
"""
    A   B
      C     -- 부모클래스가 A,B인경우 두개 이상의 클래스를 상속받는경우를 다중상속이라고 한다. 자바는 단일상속만 가능,
               다이아몬드 상속
               
    A -> B  --> D
    A -> C  --> D
    
"""

다중상속

  • 다중상속이 가능하며 메소드명이 동일한 경우 앞에거를 호출한다.
class Flyalbe:
    def fly(self):
        print("날 수 있다.")
        
    def walk(self):
        print("두 다리로 걷는다")
        
class Swimable:
    def swim(self):
        print("수영할 수 있다.")
        
    def walk(self):
        print("***두 다리로 걷는다***")
        
class Duck(Flyalbe, Swimable):
    def quack(self):
        print("꽥꽥")
        
# class Duck(Swimable, Flyalbe):
#     def quack(self):
#         print("꽥꽥")
        
d1 = Duck()
d1.fly()
d1.swim()
d1.quack()
d1.walk() #메서드명이 동일한 경우에는 앞에거를 호출한다.
#시스템이 제공하는 내장변수중에 __mro__가 상속받은 관계정보가 있어서
#이걸 따라 적용한다
#(<class '__main__.Duck'>, <class '__main__.Flyalbe'>, <class '__main__.Swimable'>, <class 'object'>)
print(Duck.__mro__) #클래스 멤버변수로 제공한다.

다이아몬드상속

  • mro : 다중 상속 시 어떤 메서드를 사용할지 결정하는 순서를 나타냄
class A:
    def __init__(self):
        print("A 생성자 호출")
        
class B(A): #A를 상속받음
    def __init__(self):
        print(("B 생성자 호출"))
        super().__init__() #부모생성자 호출하기
        #A.__init__(self) - 파이썬 이전버전에서 문제 발생가능성 있음.
     
class C(A): #A를 상속받음
    def __init__(self):
        print(("C 생성자 호출"))
        super().__init__() #부모생성자 호출하기
        
class D(B,C): #B,C를 둘다 받으면서 결과적으로 A가 두번 상속된다.
    def __init__(self):
        print(("D 생성자 호출"))
        super().__init__() #부모생성자 호출하기
        
d = D() #객체생성 - mro 규칙을 따라간다.

#isinstance(객체, 클래스) 이 객체가 클래스의 인스턴스인지 확인해준다.
print(isinstance(d, A)) #True
print(isinstance(d, B)) #True
print(isinstance(d, C)) #True
print(isinstance(d, object)) #True
print(isinstance(d, str)) #False

#object - 모든 클래스의 Base 클래스이다. 무조건 상속을 받는다.
a = object()
print(a.__class__)

예외처리

try ~ except ~ finally

  • try, except, finally를 통해 기존 오류가 생기면 완전 큰일이 난것처럼 뜨던 문구를 온화하게..? 바꿀 수 있다.
try:
    x = 10
    y = 0
    z = x/y
    print(f"x = {x}, y = {y}, z = {z}")
except ZeroDivisionError as e:
    print(e) # 결과 division by zero


try:
    x = int(input("정수 : "))
    y = int(input("정수 : "))
    z = x/y
    print(f"x = {x}, y = {y}, z = {z}")
except ZeroDivisionError as e:
    # print(e)
    print("0으로 나눌 수 없습니다.")
    
    
try:
    x = int(input("정수 : "))
    y = int(input("정수 : "))
    z = x/y
    print(f"x = {x}, y = {y}, z = {z}")
except ZeroDivisionError as e:
    # print(e) # 결과 division by zero
    print("0으로 나눌 수 없습니다.")
#finally는 주로 파일, 데이터베이스, 네트워크 처리등에 많이 사용한다.
#파일, 데이터베이스, 네트워크 연결 ...등등 오류발생 close
finally: 
    print("이 부분은 반드시 실행된다.")
   
   
try:
    a = [1,2,3,4,5]
    b = a[5] #IndexError가 나는 상황을 만들어봄.
except ZeroDivisionError as e:
    print(e)
except IndexError as e:
    print(e)
except Exception as e: #폭포수(casecading)
    print(e)
    
#raise "예외문구" - 강제예외발생
#원래 함수 종료 구문은 return 하는일이 많다.
#return 값도 전송, 함수가 끝날 때 마무리작업을 하고 나온다.
#return은 객체지향 이전부터 존재함
#생성자에 오류가 발생했을 때 어떻게 할것이냐? return 사용불가,
#그래서 만든게 raise -> 정리작업도 하고 온다.

class Test:
    def __init__(self):
        # return True
        raise Exception("객체 생성오류")
try:
    t1 = Test()
except Exception as e:
    print(e)

내장함수

  • 파이썬 안에 기본적으로 탑재되어 있는 함수이다.
  • 지금까지 문법배우면서 for문 등을 이용해 풀었던 것을 간편하게 내장함수를 사용하여 풀 수 있다.
#내장함수 : 시스템에서 만들어준 함수.

print(abs(-4)) #abs : 절대값을 구함.
print(abs(4))

print(all([1,2,3])) #all : 지금 전달받은 요소중에 0이 하나라도 존재하면 False.
print(all([1,2,3,0])) #요소전체가 True이면 True

print(any([1,2,3])) #any : 지금 전달받은 요소중에 0이 아닌것이 하나라도 존재하면 True.
print(any([1,2,3,0])) #하나라도 True이면 True
                      #0 - False, "" - False
print(any(["a","b","c"])) #True
print(any(["a","b",""])) #True

#######################################
print(dir([1,2,3])) #dir : 객체가 지닌 변수나 함수를 보여줌.
print(dir(dict()))

mok, nmg = divmod(5,3) # divmod는 두개의 숫자를 입력받아 몫과 나머지를 튜플로 리턴
print(mok)
print(nmg)

for i, c in enumerate("Life is egg"): #enumerate 순서가 있는 데이터를 입력받아 인덱스값과 같이 리턴한다.
    print(i,c)

result = eval("1+10+3") #문자열로 구성된 표현식을 입력으로 받아 해당 문자열을 실행한 결과값을 리턴
print(result)

a = [3,4,-1,2,9,8,7,12,15,21]
#음수만 filter의 첫번째 매개변수는 함수여야 한다.
#두번째 매개변수로 전달된 요소 하나를 매개변수로 하고 반환은 True or False
def isPositive(x):
    if x > 0:
        return True
    return False

poList = list(filter(isPositive, a)) # filter : 리턴값이 참인 것만 걸러내서 리턴한다.
print(poList)

#한번 만들어서 쓰고 벌는 함수인 람다를 사용하자.
poList = list(filter(lambda x: x>0, a))
print(poList)

print(f"최대값 : {max(a)}, 최소값 : {min(a)}") #max()는 최대값, min() 최소값
print(pow(2,4))

표준라이브러리

  • 말 그대로 원하는 정보를 찾아보는 곳이다.
  • 모든 라이브러리를 다 알 필요는 없고 어떤 일을 할 때 어떤 라이브러리를 사용해야 한다는 정도만 알면 된다.
#컴퓨터는 시간을 1970년 1월 1일을 기산점을 초당 1씩 카운드

import datetime
day1 = datetime.date(2021, 12, 14)
day2 = datetime.date(2023, 4, 5)
print(day1)
print(day2)
day3 = day2 - day1 #timedelta 객체로 바뀌고 날짜를 갖고 있다.
print(day3.days)

#말일까지 얼마나 남았는가?
day1 = datetime.date(2025, 5, 13)
day2 = datetime.date(2025, 5, 31)
print((day2-day1).days)

import calendar
from datetime import date
#오늘 날짜를 구한다.
today = date.today()
year = today.year
month = today.month
#tuple #해당월의 첫째날과 마지막날
last_day = calendar.monthrange(year,month)[1]
print(last_day)

day1 = datetime.date(year, month, last_day)
print((day1 - today).days)

#오늘은 무슨 요일인지
print(today.weekday()) #0이 월요일, 1이 화요일 ... 등

#문제 : 날짜를 입력받아서 그날이 무슨 요일인지를 반환
#김성재풀이
day = datetime.date(2025, 5, 11) #입력 : 날짜 : "2025-05-11"
day_yoil = day.weekday()

if day_yoil == 0: #계산 : 요일(숫자) -> 요일(문자)로 변환
    print("월")
elif day_yoil == 1:
    print("화")
elif day_yoil == 2:
    print("수")
elif day_yoil == 3:
    print("목")
elif day_yoil == 4:
    print("금")
elif day_yoil == 5:     
    print("토")
elif day_yoil == 6:
    print("일")
else:
    print("뭘까?")
    
#백현숙강사님 풀이 / 배열을 활용해서 풀어야하는데 나는 if문만 주구장창 돌렸다.
day1 = datetime.datetime.strptime("2025-05-11", "%Y-%m-%d")
print(day1.weekday())

def getWeekday(s):
    day1 = datetime.datetime.strptime(s, "%Y-%m-%d")
    weekday = day1.weekday()
    titles = ["월요일","화요일","수요일","목요일","금요일","토요일","일요일"]
    return titles[weekday]

print(getWeekday("2025-04-11"))

# #딥러닝때 shutil 사용함.
# shutil_copy.py
import shutil
shutil.copy("c:/doit/a.txt", "c:/temp/a.txt.bak")

#glob 모듈은 디렉터리 안의 파일들을 읽어서 리턴한다.
import glob 
glob.glob("c:/doit/mark*") #?는 1자리 문자열, *은 임의의 길이의 문자열을 의미한다.
['c:/doit\\marks1.py', 'c:/doit\\marks2.py', 'c:/doit\\marks3.py']

import os
print(os.environ) #os.environ은 현재 시스템의 환경 변숫값을 리턴.
print(os.environ["PATH"]) #PATH만 따로 부르는 법

print(os.getcwd()) #현재 자신의 디렉터리 위치를 리턴

#파이썬에서 os명령어를 쓰고 싶을 때는 아래와 같이 작성한다.
os.system("dir/w")
  • 이 밖에 유용한 os 관련 함수는 다음과 같다.

0개의 댓글