강의 복습 내용

  • 객체 지향이란
    • 객체 지향 개념, 특징(상속성,다형성,가시성)
    • 클로져와 decorator
  • 모듈과 패키지의 형태
  • 여러 소스에 맞는 환경을 위한 가상환경 구축법
  • 더블언더스코어와 맨글링(mangling)

얻은 지식

  • 기본적인 객체 지향 지식
  • 모듈과 패키지를 구성하는 방식
  • 더블언더스코어와 언더스코어의 의미

객체 지향 프로그래밍

  • object-oriented programming
  • 객체란
    • 속성,행동을 가지는것
    • 속성은 변수(variable), 행동은 함수(method)로 표현된다.
  • 클래스class란
    • 일종의 설계도
    • 실제 구현체는 instance

객체 예시

  • class 선언
    # class 클래스명(상속받는 객체명):
    # object는 기본객체로 생략해도 된다.
    class SoccerPlayer(object):
      # a = SoccerPlayer(name,position,back_number)로 초기화 수행
      def __init__(self,name,position,back_number)#초기화 예약 함수
          self.name = name # 받아온 값으로 객체 속성 초기화
    
      # 메소드 선언 a.chage_back_number로 수행
      def change_back_number(self,new_number):
          self.back_number = new_number
    
    • 클래스명은 snake_case보다는 CamelCase를 사용
    • 초기화는 __init__self로 진행

OOP 특징

  • 상속inheritance, 다형성polymorphism, 가시성visibility

  • inheritance 상속
    • 부모클래스로부터 속성, method를 상속받는것
      class Persion:
      def __init__(self,name):
          self.name = name
      def me(self):  
          print(f"나는 {self.name}이다.")
      class Employee(Persion):#  Person을 상속
      def __init__(self, name,salary):
          super().__init__(name) # 부모의 초기화를 따로 지정
          #salary는 Employee의 속성
          self.salary = salary
      def me(slef): # 부모의 me를 재정의 가능
          super().me() # 부모의 me를 가져와서 수행하는것도 가능
          print(f"월급은{self.salary}")
      
  • polymorphism 다형성
    • 같은 이름의 메소드의 내부 로직을 다르게 작성 ```python class Animal: def init(self,name): self.name = name def talk(self): raise NotImplementedError(“상속”) class Dog(Animal): def talk(self):
      return “월” class Cat(Animal): def talk(self): return “냥”

    #같은 부모를 상속하여 같은 메소드를 쓰더라도 #다른게 작동되게 구현함 ```

  • visibility 가시성
    • 객체의 정보를 볼 수 있는 레벨을 조절하는
    • 특정 정보를 직접적으로 값을 변경하지 못하게 하는것처럼(캡슐화 encapsulation)
      def __init__(self):
          self.__items = [] # 외부에서는 접근이 불가하게됨 - 맹글링
          
      #__items를 외부에서 사용하고 싶다면
      @property # 함수를 변수명처럼 쓰게 해준다.
      def items(self):
          # 일반적으로 그대로 주기보단 copy한 것을 return하여 원본을 보호한다.
          return self.__itmes
      

OOP개념

  • first-class objects
    • 변수나 데이터 구조에 할당이 가능한 객체
    • 함수를 변수처럼 할당이 가능한거
    • 파이썬은 1급함수
def a(x):
    return x+x

b=a # 이렇게 넘겨줄 수 있다.
b(1)
  • inner function
    • 함수 내에 또다른 함수가 존재
def c(s):
    def tc():
        print(s)
    tc()

# 클로져도 구현이 가능하다.
def c(s):
    def tc():
        print(s)
    return tc 

(복잡)decorator

  • 복잡한 클로져 함수를 간단하게 해준다.

# 간단 함수 설명
def star(func):#star는 함수func를 받는다.
    def inner(*args,**kwargs): # inner는 받은 func를 *들 사이에 넣어준다. 
        print("*"*30)
        func(*args,**kwargs)
        print("*"*30)
    return inner #inner를 반환한다.

# star(func)같은 효과를 가진다.
@star 
def printer(msg):#이거 자체를 star에 argument로 사용된다.
    print(msg)

# 사용시에는 그냥 printer지만 
printer("hello")
#결과
# ******************************
# hello
# ******************************
  • 이중으로 사용이 가능하다.
##### 이중으로 사용도 가능하다.
def percent(func):
    def inner(*args,**kwargs): 
        print("%"*30)
        func(*args,**kwargs)
        print("%"*30)
    return inner 


# star(percent(printer))와 같은 효과
@star
@percent
def printer(msg):
    print(msg)
printer("hi")
#결과
# ******************************
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# hello
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# ******************************

  • 좀더 복잡하지만 인자(exponent)를 넣어줄수 있다.

def gen(exponent): # exponent에는 2가 들어간다.
    def wrapper(f): # f에는 raise_two가 들어간다.
        def inner(*args) # *args에는 n의 값이 들어간다.
            result = f(*args)
            return exponent ** result
        return inner
    return wrapper #inner를 반환한다.

@gen(2) #exponent라는 인자를 먼저 등록한다.
def raise_two(n):
    return n**2

print(raise_two(7))
# 2 ** (7 ** 2)
    # 2^49

모듈, 패키지, 프로젝트

  • 파이썬은 대부분 다른 사용자에 의해 구현되어 있다고 한다.
  • 이런 모듈들은 객체형식으로 되어있어 끌어와서 사용한다.
  • 어떻게 사용하는 알아보자.

모듈

  • .py로 되어있는 하나의 파이썬 파일
  • 가져오기
    • 별칭으로 가져오기
import fah_converter as fah
  • 특정 함수,클래스만 호출
from fah_converter import convert_c_to_f
  • 모든함수, 클래스 호출
from fah_converter import *
  • built-in modules
    • 파이썬이 제공하는 기본 라이브러리

패키지

  • 하나의 대형 프로젝트를 만드는 코드의 묶음
  • 모듈들의 합으로, 폴더단위
  • 각 폴더마다 __init__.py파일이 존재해야함(3.3이후는 없어도 인식)
    • from과 import로 사용 가능
    • from 폴더이름 import 파일이름이런 형식으로 폴더내의 파일을 접근
      • 하위폴더와 파일을 모두 포함하게 된다.
  • __init__.py에는 무엇이 들어가나.
# __init__.py에 들어가는 내용
__all__ = ["image","sound","stage"]
# 해당 폴더에서 사용하는 내부의 파일 or 폴더의 이름을 선언한다.
from . import image
from . import sound
from . import stage

  • 최상단의 루트 폴더에 __main__.py로 전체 패키지 실행
    • 실행시 python 루트폴더명을 하면 __main__.py가 실행되게 된다.
# __main__.py 내용

from sound import echo
# sound폴더의 echo파일을 사용

if __name__ == "__main__":
    print(echo.echo_play())
    # echo의 echo_play()라는 함수를 수행하여 출력

가상환경 설정

  • 여러 프로젝트를 하다보면 환경이 달라서 충돌이 날 수 있다.
  • 새롭게 파이썬 환경을 구축하는것

도구

  • virtualenv + pip
    • 가장 대표적인도구
  • conda
    • 좀더 편리
    • windows에서 장점

가상환경 구축

  • 구축
    • conda create -n my_project python=3.8
      • conda create -n 가상환경이름 파이썬버전
  • 호출
    • conda actibate my_project
  • 해제
    • conda deactivate

기타 팁

더블 언더 스코어 , 맨글링 , 언더스코어

  • 참고
  • 특수한 예약 함수나 변수
    • __main__,__add__,__str__,__eq__
  • 함수명 변경(맨글링)으로 사용
    • 맨글링 참고
    • self.__items = [] # 외부에서는 접근이 불가하게됨
  • class선언시 사용하면 쓰면 편리하게 사용이 가능하다.
  • _하나는 따로 접근하지 않게, 가독성을 위해 사용하기도 함
    • 메모리관련해서도 좋다는 의견
    • for _ in range(100)
class SoccerPlayer(object):
    def __init__(self,name,position,back_number)
        self.name = name 
        self.__private = [] # 외부에서 직접적인 접근이 불가하게됨

    # + 할때 수행
    # SoccerPlayer객체인 a,b에 대해 a+b시 __add__를 수행하게 된다.
    def __add__(self,other):
       return self.name + other.name

    # print할때 수행
    # SoccerPlayer객체인 a에 대해 print(a)시 __str__를 수행하게 된다.
    def __str__(self):
        return f"정보{self.name}"

split관련

ex_str.strip('_').split('_')
#앞뒤로 중복된 _들을 제거해준다.
#replace로 제거하기도한다.
ex_str.replace('_')

피어세션 정리

  • 데코레이터
    • 다른 언어에서는 함수를 합치는 의미로 쓰이기도 한다고함
  • factorization
    • 통계 분해해서 특징을 찾아내는거, 잠재요인
    • 인수분해
  • 딥러닝 관련 용어 정리가 필요하다.
    • 논문보다는 용어의 기본 지식이 필요하다.
  • 책 추천
    • 모두를 위한 딥러닝
    • 밑바닥 부터 시작하는 딥러닝
    • cs 231n 강의
  • 간단한 회고

과제후기

  • 문자열과 list를 다루는 문제를 주로 하고 있다.
  • 정규식 없이 python내부적으로 구현하는지가 궁금하다.
    • 기본적으로 정규식을 사용하면 되지만…
  • 예를 들면 특정 단어가 포함되는지 확인하는데 정규식말고 다른 방법이 있을지?
    • a in ["a","b"]이런식으로 반복문을 사용하는거 뿐인지?
  • 여러 공백이 있는것을 하나의 공백으로 어떻게 처리할까?
    • split이후 다시 join하기로 진행함

회고

  • 아직 1주차도 지나지 않는 목요일이 되었다.
  • 이번주는 파이썬의 기초와 과제를 진행하는 방식을 맛보는 단계라고 생각한다.
  • 과제를 하면서 현재는 큰 어려움이 없지만 테스트하는 방식들이 손에 익지 않았다.
  • 이제 점차 ai관련 모듈도 진행하면서 ai지식을 동시에 진행되서 시간이 빡빡할듯 하다.