채니의 개발일기

클래스 - collection라이브러리 본문

프로그래밍언어/파이썬

클래스 - collection라이브러리

윤채니챈 2023. 10. 12. 22:52
728x90
반응형

colletions

 

- 파이썬의 표준 라이브러리 중 하나로 다양한 컨테이너 데이터 타입을 제공한다.

 

1) nametuple(): 튜플의 서브 클래스를 생성하는 팩토리 함수 .필드에 이름을 부여하여 튜플을 더 읽기 쉽게 만든다

 

* 필드란?

: 객체 지향 프로그래밍에서 사용 되는 용어로, 클래스나 객체 내부에서 데이터를 저장하는 변수를 의미 한다.

: 필드는 객체의 상태나 속성을 나타내며, 다른용어로는 "속성" "멤버변수", "인스턴스 변수"등으로 불린다

 

예를들어 person 클래스가 있다고 가정할때

class Person:
	def __init__(self, name, age):
    	self.name = name
        self.age = age

-> 'name'과 'age'는 'Person'의 클래스 필드이다. 이 필드들은 'Person' 객체의 상태나 속성들을 나타낸다. 즉 각, 'Person'객체는 고유의 'name'과 'age'값을 가질 수 있다.

 

객체를 생성 할 때: 

person1 = Person('Alice',30)

-> 'person1'객체는 'name'필드에 'Alice'라는 값을, 'age'필드에 30이라는 값을 가지게 된다

  

2) deque: 양쪽 끝에서 빠르게 추가 및 제거가 가능한 리스트와 유사한 데이터 타입 -> 스택과 큐를 모두 구현 할 수 있다.

3) Counter: 요소의 개수를 세는 데 유용한 딕셔너리 서브클래스 -> 빈도를 쉽게 계산가능하다

4) OrderdDict: 키의 삽입 순서를 기억하는 딕셔너리 서브 클래스이다.

5) defaauldict: 호출 가능한 함수를 제공하여 존재하지 않는 키에 대한 기본값을 반환하는 딕셔너리 서브클래스이다

6) ChainMap: 여러 딕셔너리를 하나의 매핑으로 그룹화하는 클래스이다.

7) UserDict,UserList,UserString: 딕셔너리, 리스트, 문자열의 래퍼 및 서브 클래스를 쉽게 만들 수 있도록 도와주는 클래스이다.

 

 

import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])

class FrenchDeck:
    ranks = [str(n) for n in range(2, 11)] + ['J', 'Q', 'K', 'A']
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits
                       for rank in self.ranks]
    
    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]

 

1. namedtuple 사용:

Card = collections.namedtuple('Card', ['rank', 'suit'])

'namedtuple'을 사용하여 'Card' 라는 이름의 튜플의 서브클래스를 생성한다. 이 튜플 'rank'와 'suit' 두개의 필드를 가진다. 'rank'는 카드의 숫자나 문자를 나타내고, 'suit'는 카드의 무늬를 나타낸다.

 


- 'nametuple' = 파이썬 'collections' 모듈에 포함된 팩토리 함수로, 이름이 지정된 필드를 가진 튜플의 서브클래스를 생성한다.

 

1. 데이터베이스 레코드와 유사: 'namedtuple'을 사용하면 데이터베이스 레코드와 유사한 형태의 객체를 생성할 수 있다. 각 필드에는 이름이 지정되어 있으므로, 인덱스 대신 이름으로 값을 가져올 수 있다.

 

2. 불변성: 'namedtuple'로 생성된 객체는 불편(immutable)이다. 따라서 한번 생성된 객체의 필드 값을 변경할 수 없다.

 

3. 사용자 정의 메서드가 없음: 'namedtuple'로 생성된 객체는 사용자 정의 메서드를 포함하지 않는다. 이는 간단한 데이터 구조를 표현하는데 사용한다.

 

예제)

 

from collections import namedtuple

#namedtuple을 사용하여 'Person'이라는 이름의 튜플을 정의한다

Pesron = namedtuple('Person',['name','age',gender'])

#Person 객체 생성

alice = Person(name='Alice', age=30, gender='Female')

#필드에 접근 

print(alice.name)#출력: Alice
print(alice. age) #출력:30

 

-> 위 예제에서 'Person'은 'nametuple'을 사용하여 정의된 튜플의 서브클래스이다. 

'alice'의 객체는 'Person'의 인스턴스로, 각 필드에 이름을 사용하여 접근할 수 이싿. 

 

 

2. FrenchDeck 클래스 정의: 

class FrenchDeck:

 

3. ranks와 suits: 

ranks = [str(n) for n in range(2, 11)] + ['J', 'Q', 'K', 'A']
suits = 'spades diamonds clubs hearts'.split()

'ranks'는 카드의 숫자와 문자를 나타내는 리스트이다. 2부터 10까지의 숫자와, J,Q,K,A를 포함한다

'suits'는 카드의 무늬를 나타내는 리스트이다. 스페이드, 다이아몬드, 클럽, 하트를 포함한다.

 

4. 생성자(init):

def __init__(self):
    self._cards = [Card(rank, suit) for suit in self.suits
                   for rank in self.ranks]

FrenchDeck 객체가 생성될때 실행되는 생성자로, _cards라는 내부 리스트에 52장의 카드를 생성하여 저장한다. 이때 각 카드는 'Card' namedtuple을 사용하여 생성된다

 

5. len메서드:

def __len__(self):
    return len(self._cards)

 FrenchDeck 객체의 길이를 반환하는 메서드이다. '_card' 리스트의 길이, 즉 52를 반환한다.

 

6. getitem 메서드:

def __getitem__(self, position):
    return self._cards[position]

FrenchDeck 객체에 대한 인덱싱을 지원하는 메서드 이다. 예를들어, deck[0]과 같이 객체에 인덱스를 사용하면 첫번째 카드를 반환한다.

 

728x90
반응형