[Py.4]

실행(메인)파일 (01)

(__name__ 전역변수를 이용한 실행파일 지정 (*중요!))

  • __name__ 에는 모듈 이름 or '__main__'이 저장됨

예시) - addModule.py

def add(n1, n2):
	return n1 + n2
    
if __name__ == '__main__':
    print(f'__name__ : {__name__}')

➡ __name__이라는 전역변수에 __main__이라는 값, 즉 이 파일이 실행파일일 때만 실행하고 그렇지 않을 때는 실행하지 말라.


패키지

패키지란?

  • 모듈을 묶어서 관리하는 것
  • 패키지를 이용해 관련 있는 모듈을 그룹으로 관리 가능

site-packages

  • site-packages에 있는 모듈은 어디서나 사용 가능

➡ 디렉토리를 venv로 변경 & 저장하여 사용!


자주 사용하는 모듈

# 수학 관련 함수

# 합
listVar = [2, 5, 3.14, 58, 10, 2]
print(f'sum(listVar) = {sum(listVar)}')

# 최댓값
listVar = [2, 5, 3.14, 58, 10, 2]
print(f'max(listVar) = {max(listVar)}')

# 최솟값
listVar = [2, 5, 3.14, 58, 10, 2]
print(f'min(listVar) = {min(listVar)}')

# 거듭제곱
print(f'pow(13, 2) : {pow(13, 2)}')
print(f'pow(13, 3) : {pow(13, 3)}')
print(f'pow(13, 4) : {pow(13, 4)}')

# 반올림
print(f'{round(3.141592, 1)}')
print(f'{round(3.141592, 2)}')
print(f'{round(3.141592, 3)}')

import math

# 절댓값
print(f'math.fabs(-10) : {math.fabs(-10)}')
print(f'math.fabs(-0.12895) : {math.fabs(-0.12895)}')

# 올림
print(f'math.ceil(5.21) : {math.ceil(5.21)}')
print(f'math.ceil(-5.21) : {math.ceil(-5.21)}')

# 내림
print(f'math.floor(5.21) : {math.floor(5.21)}')
print(f'math.floor(-5.21) : {math.floor(-5.21)}')

# 버림
print(f'math.trunc(5.21) : {math.trunc(5.21)}')
print(f'math.trunc(-5.21) : {math.trunc(-5.21)}')

# 최대공약수
print(f'math.gcd(14, 21) : {math.gcd(14, 21)}')

# 팩토리얼
print(f'math.factorial(10) : {math.factorial(10)}')

# 제곱근
print(f'math.sqrt(4) : {math.sqrt(4)}')


import time

lt = time.localtime()
print(f'time.localtime() = {lt}')

print(f'lt.tm_year : {lt.tm_year}')
print(f'lt.tm_mon : {lt.tm_mon}')
print(f'lt.tm_day : {lt.tm_mday }')
print(f'lt.tm_wday : {lt.tm_wday }')

print(f'lt.tm_hour : {lt.tm_hour }')
print(f'lt.tm_min : {lt.tm_min }')
print(f'lt.tm_sec : {lt.tm_sec }')

객체지향 프로그래밍

  • 객체를 이용한 프로그램으로, 객체는 속성과 기능으로 구성됨

  • 클래스에서 생성됨

  • 이름의 첫 단어는 대문자!

객체 사용의 장점

  • 코드 재사용, 모듈화에 좋음


클래스와 객체 생성

  • class 키워드와 속성(변수), 그리고 기능(함수)으로 구성됨

  • 객체는 클래스의 생성자를 호출함

  • 실습 예제) 계산기 클래스를 만들고 사칙연산을 실행해 보자.

class Calculator:

    def __init__(self):
        self.number1 = 0
        self.number2 = 0
        self.result = 0

    def add(self):
        self.result = self.number1 + self.number2
        return self.result

    def sub(self):
        self.result = self.number1 - self.number2
        return self.result

    def mul(self):
        self.result = self.number1 * self.number2
        return self.result

    def div(self):
        self.result = self.number1 / self.number2
        return self.result

inputNum = Calculator()

inputNum.number1 = int(input('첫 번째 숫자 : '))
inputNum.number2 = int(input('두 번째 숫자 : '))

print(f'덧셈 : {inputNum.add()}')
print(f'뺄셈 : {inputNum.sub()}')
print(f'곱셈 : {inputNum.mul()}')
print(f'나눗셈 : {inputNum.div()}')



[Py.5-6]

객체와 메모리

  • 변수는 객체의 메모리 주소를 저장 & 이를 이용해 객체를 참조


얕은 복사 & 깊은 복사

1. 얕은 복사

  • 객체 주소를 복사하는 것 (객체 자체가 복사되지는 않음)

실습 예시)

class TmpCls:

    def __init__(self, n, s):
        self.number = n
        self.str = s

    def printClsInfo(self):
        print(f'self.number: {self.number}')
        print(f'self.str: {self.str}')

tc1 = TmpCls(10, 'Hello')
tc2 = tc1

tc1.printClsInfo()
tc2.printClsInfo()

tc2.number = 3.14
tc2.str = 'bye'

tc1.printClsInfo()
tc2.printClsInfo()

2. 깊은 복사

  • 객체 자체를 복사하는 것 (또 하나의 객체가 생성됨)

실습 예시)

import copy

class TmpCls:

    def __init__(self, n, s):
        self.number = n
        self.str = s

    def printClsInfo(self):
        print(f'self.number: {self.number}')
        print(f'self.str: {self.str}')

tc1 = TmpCls(10, 'Hello')
tc2 = copy.copy(tc1)

tc1.printClsInfo()
tc2.printClsInfo()

tc2.number = 3.14
tc2.str = 'bye'

tc1.printClsInfo()
tc2.printClsInfo()

* 강의 내용 중 복습할 부분

# 강의 내용 중 얕은 복사 & 깊은 복사

# 얕은 복사
import copy

scores = [9, 8, 5, 7, 6, 10]
scoresCopy = []

scoresCopy = scores
print(f'id(scores): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
# 같은 주소를 가리키고 있음을 확인

#깊은 복사 - append
for s in scores:
    scoresCopy.append(s)
print(f'id(scores): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
# 다른 주소를 가리키고 있음을 확인

# 다른 방식의 깊은 복사 (1) - extend
scoresCopy.extend(scores)

# 다른 방식의 깊은 복사 (2) - copy
scoresCopy = scores.copy()

# 다른 방식의 깊은 복사 (3) - 슬라이싱
scoresCopy = scores[:]

print(f'id(scores): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')

클래스 상속

  • 클래스 안에 또 다른 클래스를 상속해서 내 것처럼 사용 가능

실습 예제)

class CalculatorSuper:

    def add(self, n1, n2):
        return n1 + n2

    def sub(self, n1, n2):
        return n1 - n2

class CalculatorChild(CalculatorSuper):

    def mul(self, n1, n2):
        return n1 * n2

    def div(self, n1, n2):
        return n1 / n2


cal = CalculatorChild()

print(f'cal.add(10, 20): {cal.add(10, 20)}')
print(f'cal.sub(10, 20): {cal.sub(10, 20)}')
print(f'cal.mul(10, 20): {cal.mul(10, 20)}')
print(f'cal.div(10, 20): {cal.div(10, 20)}')

생성자

  • 객체가 생성될 때, 생성자를 호출하면 __init__()가 자동 호출됨

  • __init__()가 속성을 초기화함

  • 상위 클래스의 속성을 초기화하기 위해 super()을 이용

실습 예제)

class MidExam:

    def __init__(self, s1, s2, s3):
        print('[MidExam] __init__() called!!')

        self.mid_kor_score = s1
        self.mid_eng_score = s2
        self.mid_math_score = s3

    def printScores(self):
        print(f'mid_kor_score: {self.mid_kor_score}')
        print(f'mid_eng_score: {self.mid_eng_score}')
        print(f'mid_math_score: {self.mid_math_score}')


class EndExam(MidExam):

    def __init__(self, s1, s2, s3, s4, s5, s6):
        print('[EndExam] __init__() called!!')

        super().__init__(s1, s2, s3)

        self.end_kor_score = s4
        self.end_eng_score = s5
        self.end_math_score = s6

    def printScores(self):
    	# 빼먹지 말기!
        super().printScores()
        print(f'end_kor_score: {self.end_kor_score}')
        print(f'end_eng_score: {self.end_eng_score}')
        print(f'end_math_score: {self.end_math_score}')

    def getTotalScore(self):
        total = self.mid_kor_score + self.mid_eng_score + self.mid_math_score
        total += self.end_kor_score + self.end_eng_score + self.end_math_score

        return total

    def getAverageScore(self):
        return self.getTotalScore() / 6


exam = EndExam(85, 90, 88, 75, 85, 95)
exam.printScores()

print(f'Total : {exam.getTotalScore()}')
print(f'Average : {round(exam.getAverageScore(), 2)}')

다중 상속

  • 2개 이상의 클래스를 상속하는 것

실습 예제)

class BasicCalculator:

    def add(self, n1, n2):
        return n1 + n2

    def sub(self, n1, n2):
        return n1 - n2

    def mul(self, n1, n2):
        return n1 * n2

    def div(self, n1, n2):
        return n1 / n2

class DeveloperCalculator:

    def mod(self, n1, n2):
        return n1 % n2

    def flo(self, n1, n2):
        return n1 // n2

    def exp(self, n1, n2):
        return n1 ** n2

class Calculator(BasicCalculator, DeveloperCalculator):

    def __int__(self):
        pass


cal = Calculator()

print(f'cal.add(10, 20): {cal.add(10, 20)}')
print(f'cal.sub(10, 20): {cal.sub(10, 20)}')
print(f'cal.mul(10, 20): {cal.mul(10, 20)}')
print(f'cal.div(10, 20): {cal.div(10, 20)}')
print(f'cal.mod(10, 20): {cal.mod(10, 20)}')
print(f'cal.flo(10, 20): {cal.flo(10, 20)}')
print(f'cal.exp(10, 20): {cal.exp(10, 2)}')

오버라이딩 (overriding)

  • 하위 클래스에서 상위 클래스의 메서드를 재정의하는 것

추상클래스

  • 상위 클래스에서 하위 클래스에 메서드 구현을 강요함


예외란?

  • 문법적인 문제는 없으나 실행 중 발생하는 예상치 못한 문제

  • 예외 관련 클래스는 Exception 클래스를 상속함

이상 데이터 취업 스쿨 Chpt.3 파이썬 중급의 저번 진도 이후의 스터디노트이다

여전히 진도를 따라잡는 중이며, 클래스 이후로 계속 어려움이 존재한다.

마음은 조급하나 할 것은 많다는 부분이 더욱 힘들게 한다.

빨리 익숙해져 좋은 결과를 냈으면 좋겠다는 마음이 든다.





이미지 출처: @waterglasstoon, 제로베이스 강의 일부

profile
On My Way

0개의 댓글