본문 바로가기

노력/인공지능

9. 파이썬 개인공부 (복습, 요약)

데이터 타입

 데이터 타입

시퀀스 

뮤터블 

이터러블 

 int

 X

 float

 X

 complex

 X

 bool

 X

 str

 O

 bytes

 O

 bytearray

 O

 tuple

 O

 list

 O

 dictionary

 X

 set

 X

O

 range

 O


int, float, complex, bool은 모두 단일형.


str, bytes, bytearray는 문자열을 나타내는 형. 모두 시퀀스이며 이터러블형이다. str과 bytes는 이뮤터블.


tuple과 list는 유사하지만 tuple은 변화할 수 없는 이뮤터블형이다.


dictionary는 3가지 딕셔너리 뷰(dictionary view)를 가진다.


  1. keys()
  2. values()
  3. items()

dictionary와 set은 중복이 없고 순서도 없다.


range는 숫자를 순서대로 생성하는 시퀀스이다. 이뮤터블형이다.




변수 선언

리터럴 vs 인스턴스화

리터럴 형태로 선언할 수도 있고, 인스턴스화로 선언할 수도 있다. 내부적으로는 인스턴스화와 리터럴로 선언하는 것은 같은 형태이다. 인스턴스화에서 자주 쓰는 것들을 모아둔 것을 리터럴이라고 한다.

a = 3 (리터럴)
a = int(3) (인스턴스화)

b = [] (리터럴)
b = list() (인스턴스화)


컴프리헨션

리스트 컴프리헨션 : [number for number in range(1, 10)]


[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


한 번에 선언할 수 있다. 반복문을 사용하거나 직접 1부터 10까지 입력하는 방법보다 훨씬 쉽다.


괄호의 형태를 바꾸어 딕셔너리 컴프리헨션, 셋 컴프리헨션 모두 가능.



제너레이터

하지만 튜플 컴프리헨션이라는 것은 따로 없고 (number for number in range(1, 10))와 같은 형태를 제너레이터 컴프리헨션이라고 부른다.

range()도 제너레이터이다.

제너레이터 함수는 yield를 사용하여 값을 반환한다.

함수

함수

def func():
    print('wow!')

내부 함수

def func():
    def inner_func():
        동작
    return inner_func()        

클로저

def func(wow):
    def closure():
        동작 + wow
    return closure


내부함수와 다른 점은, 외부함수인 func에 들어온 wow 변수를 직접 사용하며 return이 함수의 동작 값이 아니라 함수 이름을 반환한다는 점이다.

익명 함수 : lambda()

파이썬의 람다 함수는 단일문이다. 식처럼 사용할 수 있다.

names = ['messi', 'ronaldo', 'griezmann']

def cap_players(names, func):
    for name in names:
        print(func(name))

cap_players(names, lambda name: name.capitalize() + '!') :
Messi!
Ronaldo!
Griezmann!


데코레이터

데코레이터는 하나의 함수를 취해서 다른 함수를 반환하는 함수다.


위 블로그에 굉장히 설명이 잘 되어있다.


이미 만들어진 함수들에 같은 동작을 넣고 싶을 때 사용하면 유용하다.


데코레이터를 만들고 @를 써서 사용할 수 있다.


@decorator

def shout_name():

    print("NAME!!!!)



shout_name()을 호출하면 데코레이터를 써서 shout_name() 위아래로 무언가를 쓸 수 있다.


객체

객체

파이썬은 모두 객체로 이루어져 있다.

a = 7 : int라는 객체를 참조한 결과가 a에 할당된다.

객체는 속성과 메소드를 포함한다.

클래스 선언

class Baek():
    pass

빈 클래스이다. 호출하면 아무 동작없이 넘어간다.

class Baek():
    def __init__(self):
        pass

생성자이다. __init__은 스페셜 메소드, 매직 메소드라고 부른다. self는 자기 자신을 가리키는 객체 이름이며 키워드는 아니지만 관례상 그렇게 사용한다.

class Baek():
    def __init__(self, name):
        self.name = name


위 처럼 사용하면 album = Baek('Yerin') 이것처럼 입력할 수 있으며 album의 name이라는 속성에 'Yerin'이 입력된 초기 객체가 생성된다.


상속

class Singer():
    pass

class Baek(Singer):
    pass

Baek은 Singer를 상속받는다. Baek-is-a-Singer.

Singer 안의 메소드를 상속받게 된다.

메소드 오버라이드

class Singer():
    def sing(self):
        print("sing")

class Baek(Singer):
    def sing(self):
        print("내가 날 모르는 것처럼")


메소드 sing을 Singer에게서 상속받지만 Baek 클래스 자신이 다시 메소드 선언을 해 메소드 오버라이드 했기 때문에 Baek을 사용해 만들어진 객체는 sing이라는 행동을 했을 때 "내가 날 모르는 것처럼"을 출력한다.


getter/setter

getter 앞에는 데코레이터 @property를 붙인다.
setter 앞에는 @name.setter를 쓴다.

setter의 name은 메소드의 이름을 가져다 사용하면 된다.

class ...():
    @setting_park.setter
    def setting_park(self, name):

       self.name = name


private

__를 사용해서 private로 쓸 수 있다.


class Wow():

    def __init__(self, name):

         self.__name = name


wow1 = Wow('Kim')


wow1.__name : 이렇게 접근할 수 없다.


메소드 타입

메소드의 첫번째 인자가 self라면 인스턴스 메소드.

@classmethod 데코레이터를 사용해서 클래스 메소드라는 것을 알려준다.

보통 이 메서드의 첫 인자를 cls라고 쓴다. 예약어는 아니지만 관례상 그렇게 사용한다.

클래스 메소드는 클래스 자체에 변화를 일으킬 수 있다. 클래스 자체 이름에서도 사용할 수 있다. 인스턴스가 아니어도 사용 가능.


정적 메소드는 @staticmethod 데코레이터가 붙어있다.

덕 타이핑

def quack(obj):
    print(obj.who(), 'quack', obj.says()


꽥 메소드 안에 who와 says가 있다.

어떤 객체이던 안에 who()와 says()가 있다면 위 메소드를 사용할 수 있다.

이런 형태를 덕 타이핑이라고 부른다.

컴포지션

상속 대신에 다른 객체의 속성의 일부를 가져와서 사용하는 방법이다.

상속은 부모의 모든 속성과 메소드를 가져오기 때문에 메모리의 낭비가 있을 수 있다.

컴포지션은 다른 객체의 일부를 가져와서 사용하는 방법이다.

단점이라면 부모 객체의 구조를 상세히 알아야 사용하는 데에 지장이 없다는 점이다.