# Chapter04_04
# 시퀀스 형 : 순서가 있고 번호가 나열됨
# 컨테이너(Container : 서로 다른 자료형[List, Tuple, collections.deque])
# 플랫(Flat : 한 개의 자료형[str, bytes, bytearray, array.array, memoryview])
# 가변(mutable) : List, bytearray, array.array, memoryview, collections.deque
# 불변(immutable) : Tuple, str, bytes
# 해쉬테이블(HashTable) -> 적은 리소스로 많은 데이터를 효율적으로 관리
# Dict -> Key 중복허용 X, Set -> 중복 허용 X
# Dict 및 Set 심화
# immutable Dict
from types import MappingProxyType
d = {'key1': 'value1'}
# Read Only
d_frozen = MappingProxyType(d)
print(d, id(d))
print(d_frozen, id(d_frozen))
# 수정 가능
d['key2'] = 'value2'
print(d)
# 수정 불가 -> immutable이기 때문
#d_frozen['key2'] = 'value2'
# Set
s1 = {'Apple', 'Orange', 'Orange', 'kiwi', 'apple'}
s2 = set(['Apple', 'Orange', 'Orange', 'kiwi', 'apple'])
s3 = {3}
s4 = set() # Not {} <- <class 'dict'>
s5 = frozenset({'Apple', 'Orange', 'Orange', 'kiwi', 'apple'})
s1.add('melon')
print(s1)
# 추가 불가
# s5.add('melon') # Fronze으로 Read Only기 때문
print(s1, type(s1))
print(s2, type(s2))
print(s3, type(s3))
print(s4, type(s4))
print(s5, type(s5))
# 선언 최적화
# 바이트 코드 -> 파이썬 인터프리터 실행
from dis import dis
print('----------------------')
print(dis('{10}'))
print('----------------------')
print(dis('{set(10)}'))
# Set Comprehension
print('---------------------')
from unicodedata import name
print({name(chr(i), ) for i in range(0,256)})