-
[Fluent Python] 딕셔너리와 집합Programming/Python 2023. 6. 12. 10:14
키 조건
해시 가능하다 ⇒ 수명 주기 동안 결코 변하지 않는 해시값, 다른 객체와 비교할 수 있다.
(원자적 불변형 (str, byte, 수치형), frozenset, tuple(불변형 시퀀스만 포함한 시퀀스))
지능형 딕셔너리 ( dictcomp)
country = {country : code for code, country in DIAL_CODES} DIAL_CODES = [(86, ‘China’), .......]
duck typing 찾기
isinstance 의 정확한 정리 필요
객체 메소드를 사용할 때 해당하는 메소드를 재귀적으로 사용하는 부분을 없애야한다.
contains() 메소드 내에서 in self 사용시 contains()를 호출하는 바보같은 일이 일어남 key in self(재귀적으로 호출되어짐) → key in self.keys()
dict 와 collections.UserDict() 차이
setitem()을 사용할 수 있다.
해당하는 key값을 str로 변경하는 등의 작업이 가능해짐
불변 매핑을 사용하고 싶을 시
types 에서 MappingProxyType을 사용하면 가능하다
ex)
d = {1 : ‘A’}
d_proxy = MappingProxyType(d)
이렇게 할 경우 d로 접근해서는 변경이 가능하지만
d_proxy에서 접근 후 추가 수정 삭제 는 못함
집합형(set, frozenset)
set 은 가변형 , frozenset 은 불변형
set 은 리터럴 구문으로 하는 것이 생성자를 통해서 하는 것 보다 빠르다
frozenset 은 생성자로만 호출해서 생성해야함
💡 파이썬 3.3부터 str.bytes.datetime 객체의 해시에는 무작의 솔트 값이 추가된다.
파이썬 프로세스가 실행되는 동안에는 동일하게 유지되지만 파이썬 프로세스를 새로 실행하면 달라진다.
dos 공격을 피하기 위한 보안 장치로 사용된다.해시 테이블 알고리즘
- 키에서 해시를 계산 ⇒ 해시의 일부를 이용해서 해시 테이블 안에 있는 버킷 위치를 찾음
- 빈 버킷이면 key error 발생, 끝
- 키가 동일한 경우 반환, 아닌 경우 1 번에서 다른 일부를 이용해서 버킷 위를 찾음 무한 반복 찾을때까지
평균 충돌 횟수는 1 ~ 2 사이 , 비트를 많이 사용할 수록 충돌률이 낮아짐, 크면 클 수록 공간이 많아서
dict 는 키 검색이 아주 빠르지만 대신에 공간을 포기함 , 이유는 버킷의 할당되는 크기 때문에
💡 dict는 기본 적으로 순서를 보장한다. 하지만 항목을 추가할 경우에 기존 키의 순서가 변경될 수 있다.
이유는 기존에 할당된 크기보다 더 커질 경우 새롭게 메모리 테이블에 할당해야하는데 이때 해시 충돌로 인해 순서가 달라질 수 있음. 이 현상은 예측 불가함집합의 경우 요소의 순서는 요소를 추가한 순서에 따라 달라진다.
요소를 집합에 추가하면 다른 요소의 순서가 바뀔 수 있다.
'Programming > Python' 카테고리의 다른 글
[Fluent Python]일급 함수 (0) 2023.06.12 [Fluent Python] 텍스트와 바이트 (0) 2023.06.12 [Fluent Python] 내장 시퀀스 (0) 2023.06.12 [Fluent Python]파이썬 데이터 모델 (0) 2023.06.12 Synology Chat Webhook 을 통한 메시지 전송(Feat. Jira, Python) (2) 2023.06.03