0. Introduction
- 파이썬에 존재하는 모든 sequence type 및 data structure에 대해 조금 더 깊이 알아보자.
data structure
: 논리적인 관계로 이루어진 데이터 구성
- 이러한 Data type 들이 있고, 각각의 특징을 이해하여 코드에 녹여내자.
- 각 data type에 대해서 여기에 언급된 내용이 전부가 아니니 더 공부하자.
1. Python data type 상세 분류
Python의 data type은 여러 기준으로 분류될 수 있다.
1.1 무슨 형태의 자료형을 담을 수 있는가???
Container 형: 서로 다른 자료형을 담을 수 있다.
ex) list, tuple, collections.deque..flat 형: 한 가지 자료형만 담을 수 있다.
ex) string, bytes, byte array, array, memoryview…
|
|
1.2 element가 수정될 수 있는가?? 없는가??
Mutable: 변경할 수 있는 date type
ex) list, dictionary, set, bytearray, array, memoryview, deque..Immutable: 변경할 수 없는 data type
ex) tuple, str, bytes, int, float…수정될 수 있으면 element를 교체, 삭제, 추가가 가능하다.
ex) del, append 등등 가능
1.3 순서가 있는가 없는가???
Sequence: 순서가 존재한다.
ex) list, tuple, string ..Collections: 순서가 존재하지 않는다.
ex) set, dictionary ..순서가 존재하면 slicing, indexing 이 가능하다.
2. Mutable 과 Immutable
mutable: value를 수정할 수 있기 때문에, ‘id’ 값을 바꾸지 않는다.
immutable: value가 변경되지 못하기 때문에, ‘id’ 값을 바꾼다.
id()
을 사용하여 mutable과 immutable에 대해 자세히 알아보자.
mutable:
- 함수 안에서 매개변수의 값을 변경하면 객체 자체를 업데이트 한다.
- 따라서, 매개변수의 값을 변경하면 호출하는 쪽의 실제 인수는 변경 된다.
- 그 대신 id 값은 변경되지 않는다.
immutable:
- 함수 안에서 매개변수 값을 변경하면 다른 객체를 생성 하고, 그 객체에 대한 참조로 업데이트된다.
- 따라서 매개변수의 값을 변경해도 호출하는 쪽의 실제 인수에는 영향을 주지 않는다.
- 그 대신 id 값은 변경된다.
Data type | Mutable | Immutable |
---|---|---|
매개변수 값 변경 시도 | 객체 자체를 업데이트 | 다른 객체를 생성 |
실제 인수 영향 | 변경 O | 변경 X |
id 값 | 변경 X | 변경 O |
call by | reference | value |
- mutable과 immutable에 call by 방식 차이 출처: Python study - call by reference value
2.1 Immutable
- 문자열과 누적변수 예시를 통해 알아보자.
|
|
int형은 분명 immutable인데 어떻게 수정이 가능할까???
- 이는 int형 객체 12의 값 자체를 변경한 것이 아니라, 다른 정수형 객체 13을 참조하도록 업데이트됐다.
immutable
은 값 자체를 변경할 수 없기 때문에, 다른 객체를 참조하여id
값이 바뀐다.그래서
누적 변수
를 출력하면id
가 달라지는 걸 알 수 있다.누적 변수
: 변수값에 특정값을 더한 결과값을 다시 대입하여 업데이트한 변수
2.2 Mutable
- 이번에 mutable 예시를 들어보자.
|
|
- list는
mutable
로 성분값을 수정할 수 있어서,id
값이 수정 전과 동일하다.
3. List comprehension
3.1 List comprehension의 의미와 구조
List comprehension이란 list를 만드는 간결한 문법을 말한다.
List comprehensions provide a concise way to create lists.
from: list comprehension
list comprehension에 대해 찾아보니 번역이 다양하고, 딱 들어맞는게 없어서 고유 명사의 의미로 그대로 사용하겠다.
그러면 일반적으로 list를 만드는 방법과 비교해보자.
|
|
그러면 위 예시를 통해
list comprehension
의 문법에 대해 정리해보자.[‘변수(B)를 사용하여 list의 성분이 될 값(A)’ for ‘사용할 변수 이름(B)’ in ‘iterator’]
list comprehension
에서if 조건문
은for문
표현식 뒤에 설정할 수 있다.
지난 번에 알아본
namedtuple
을 사용해서 예시를 만들어보자.
|
|
- 예제 2-2의 경우, 여러 for문을 사용했다.
- 한 줄로 표현할 수 있지만, 가독성이 떨어진다.
- 코드 몇 줄을 줄이기 위해서 가독성이 많이 떨어진다면 재고할 방법이다.
3.2 list comprehension의 주의사항
깊은 복사와 얕은 복사를 주의하라. 깊은 복사와 얕은 복사에 대한 자세한 내용은 [TIL] Python basic 41: Shallow copy & Deep copy을 참고한다.
|
|
‘marks2’
- 하나의 값이 4개로 복사되었다는 건 하나의 id값이 복사된 걸 의미한다.
- 한 객체를 참조하는 게 4개다.
- 그래서 하나의 객체만 수정해도 이 객체를 참조하는 값들까지 다 수정된다.
- 이를
얕은 복사(copy)
라고 한다.
‘marks1’
- ‘marks2’ 와 달리 for문을 통해 다 새로 만들어졌다.
- 그래서 각각 다른 객체를 참조 한다.
- 이를
깊은 복사(deepcopy)
라 한다.
이를
id
값으로 확인해보자.
|
|
- 그래서 copy 형식을 사용할 때는 조심히 다뤄야 한다.
id
값을 확인해보고, 꼼꼼히 개발하자.
4. Advanced tuple with unpacking
1. 인자를 입력할 때 upacking을 사용할 수 있다.
2. 반환값을 unpacking하여 출력할 수 있다.
3. unpacking으로 여러 값을 담을 수 있다.
tuple에
unpacking
을 사용하여 더 깊이 들어가자.tuple은
immutable
이지만,unpacking
으로 풀을 수 있다.오픈 소스들을 보면 아래 방식으로 코딩한 경우가 많으므로, 아래 3가지 경우를 눈에 익혀두자.
|
|
- range:
- Return an object that produces a sequence of integers from start (inclusive) to stop (exclusive) by step
|
|
5. Advanced dictionary
5.1 hash table이란??
key를 사용하여 적은 리소스로 많은 데이터를 효율적으로 관리하는 데이터 구조 타입으로 그 예가 dictionary다. key : value 로 된 자료형을 의미한다. from reference
dictionary에 대해 간단히 정리하면
key
:value
로 구성된 data type을 말한다.dictionary의
key
는 중복을 허용하지 않는다.- ex) 각 사람이 가지고 있는 주민등록번호
python의 dictionary는 key 를 hash 함수를 통해서 hash 주소로 변환하는 원리이기 때문에, key 를 통해서 value 에 접근할 수 있다.
참고: 파이썬 언어 자체가 강력한 hash table 엔진으로 만들어졌기 때문에, 파이썬에서는 hash table을 별도로 구현할 필요가 없다.
- 그러면 직접 이에 대해서 알아보자.
|
|
- hash 값을 확인할 수 있다는 건
고유하다
는 의미로,수정 불가능
하다는 걸 말한다. - 그래서 list type의 hash number를 확인할려고 했으나, TypeError가 뜬 것이다.
- list는
mutable
이기 때문이다.
5.2 key가 중복되는 dictionary 만들기
’ setdefault ‘를 사용하여 만든다. 이 방법은 tuple로 dictionary를 만들 때, 권고되는 방법이다.
- 이런 방식으로 자주 구현하므로 눈에 익혀두자.
|
|
setdefault
를 사용하여 훨씬 짧은 코드로 key가 중복된 tuple을 dictionary로 구현했다.setdefault
를 사용하여[]
가 아닌()
로 했다면 tuple이므로 만들 수 없다.
- 만약, dictionary를 만들 때 키가 중복되면 나중 값으로 overwritten된다.
|
|
5.3 Immutable Dictionary 생성하기
immutable dictionary 즉, ‘읽기 전용’ dictionary를 만들어보자.
왜 읽기 전용을 만들까???
- ‘읽기 전용’을 만들지 않고, 파일을 그냥 두어도 된다.
- 하지만, communication의 문제로 팀원이 이 데이터를 수정할수도 있다.
- 그래서 수정하면 안되는 file은 ‘읽기 전용’으로 만든다.
‘읽기 전용’으로 만들기 위해서
MappingProxyType
를 사용할 것이다.- data 이름에는
_frozen
을 작성한다. (외국에서는 이렇게 한다.)
|
|
d
와d_frozen
이==
을 통해서 value가 같다는 건 확인했다.- 하지만, 서로 다른 객체라는 걸
id
를 통해 확인했다. - 다른 객체를 참조했기 때문에
is
로 확인했을 때, false가 뜬 것이다.
6. Advanced set
6.1 Immutable set
’ frozenset ‘을 사용하여 ‘mutable’ 인 set을 ’ immutable’ 로 바꾸기
- set data type을 선언하는 방법은 다음과 같다.
|
|
- 그러면
frozenset
을 사용하여 선언해보자.
|
|
- 그러면 s1과 s5에 각각 원소를 추가한 후, 출력한다.
|
|
frozenset
을 통해서 immutable set인 frozenset으로 type이 바뀐 걸 알 수 있다.
6.2 선언 최적화
from dis import dis 사용하여, 더 빠른 선언법을 확인하기
요즘은 하드웨어의 성능이 매우 좋기 때문에, 소량의 데이터에서는 큰 영향이 없다.
하지만, 데이터량이 늘어남에 따라 작은 최적화가 쌓여 큰 성능 개선을 이룰 수 있으므로, 확인해보자.
위의 여러 set 선언 방법들 중 어느 것이 제일 빠를까???
|
|
- set([10]) 은 5단계, {10}은 3단계로 s1처럼 선언하는 방식이 더 빠르다는 걸 알 수 있다.
6.3 Set comprehension
list comprehension에서 알아봤기 때문에, comprehension의 의미는 생략한다.
바로 실습해보자.
|
|
- set 또한 list처럼 comprehension의 방법으로 선언할 수 있다는 걸 확인했다.
- 간결한 선언법이 장점이지만, 과하면 가독성이 좋지 않다는 걸 기억하자.