전문가를 위한 파이썬을 정리한 내용입니다.
시퀀스(Sequence)
컨테이너 시퀀스
- 서로 다른 자료형의 항목들을 담을 수 있는 list, tuple, collections.deque 형
균일 시권스
- 단 하나의 자료형만 담을 수 있는 str, bytes, bytearray, memoryview, array.array 형
- 균일 시퀀스가 컨테이너 시퀀스보다 메모리를 더 적게 사용합니다. 대신 기본적인 자료형만 저장할 수 있습니다.(문자, 바이트, 숫자 등)
가변 시퀀스
- list, bytearray, array.array, collections.deque, memoryview 형
불변 시퀀스
제너레이터 표현식
- 튜플, 배열 등의 시퀀스형을 초기화하려면 list comprehension을 사용할 수도 있지만, 다른 생성자에 전달할 리스트를 통째로 만들지 않고 반복자 프로토콜을 이용해서 항목을 하나씩 생성하는 제너레이터 표현식은 메모리를 더 적게 사용합니다.
>>> symbols = "$%^%@#"
>>> tuple(ord(symbol) for symbol in symbols)
>>> array.array('I', (ord(symbol) for symbol in symbols))
>>> color = ['black', 'white']
>>> sizes = ['S', 'M', 'L']
>>> for tshirt in ('%s %s' % (c, s) for c in colors for s in sizes):
print(tshirt)
- 제너레이터 표현식은 한 번에 하나의 항목을 생성하므로 메모리가 절약됩니다.
- list comprehension으로 사용했을 때는 6개의 종류를 담고 있는 리스트를 만듭니다.
* 언패킹
- 함수 매개변수에 *를 연결해서 초과된 인수를 가져오는 방법은 파이썬의 고전적인 기능입니다.
- 파이썬 3에서는 이 개념을 확장해서 다음과 같이 병렬 할당에도 적용할 수 있습니다.
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
>>> a, b, *rest = range(3)
>>> a, b, rest
(0, 1, [2])
>>> a, b, *rest = range(2)
>>> a, b, rest
(0, 1, [])
병렬 할당의 경우 *는 단 하나의 변수에만 적용할 수 있습니다. 하지만 다음과 같이 어떠한 변수에도 적용할 수 있습니다.
>>> a, *body, c, d = range(5)
>>> a, body, c, d
(0, [1, 2], 3, 4)
>>> *head, b, c, d = range(5)
>>> head, b, c, d
([0, 1], 2, 3, 4)
namedtuple()
- collections.namedtuple() 함수는 필드명과 클래스명을 추가한 튜플의 서브클래스를 생성하는 팩토리 함수로서, 디버깅할 때 유용합니다.
- 필드명이 클래스에 저장되므로 namedtuple()로 생성한 객체는 튜플과 동일한 크기의 메모리만 사용합니다. 속성을 객체마다 존재하는
__dict__
에 저장하지 않으므로 일반적인 객체보다 메모리를 적게 사용합니다.
Card = collections.namedtuple('Card', ['rank', 'suit'])
>>> City = namedtuple('City', 'name country population coordinates')
>>> seoul = City('Seoul', 'KR', 36.933, (35.45596, 138.1223124))
>>> seoul
City(name='Seoul', country='KR', population=36.933, coordinates=(35.45596, 138.1223124))
>>> seoul.population
36.933
>>> seoul.name
'Seoul'
>>> seoul[1]
'KR'
_make(), _asdict()
- _make(iterable) 클래스 메서드
_make()는 반복형 객체로부터 namedtuple을 만듭니다.
- _asdict()는 namedtuple 객체에서 collections.OrderedDict 객체로 반환합니다.
슬라이싱
- 파이썬에서 제공하는 list, tuple, str. 그리고 모든 시퀀스형은 슬라이싱연산을 지원합니다.
슬라이스와 범위 지정시에 마지막 항목이 포함되지 않는 이유
- 슬라이스와 범위 지정시에 마지막 항목을 포함하지 않는 관례는 인덱스 번호가 0번부터 시작하는 파이썬, C 등의 언어에서 잘 동작합니다.
- 이와 같은 관례로 다음과 같은 장점들이 있습니다.
- 세 개의 항목을 생성하는 range(3)나 my_list[:3]처럼 중단점만 이용해서 슬라이스나 범위를 지정할 때 길이를 계산하기 쉽습니다.
- 시작점과 중단점을 모두 지정할 때도 길이를 계산하기 쉽습니다. 단지 중단점에서 시작점을 빼면 됩니다.
- 인덱스를 기준으로 겹침 없이 시퀀스를 분할하기 쉽습니다. 단지 my_list[:x]와 my_list[x:]로 지정하면 됩니다.