Programming/Python
[Fluent Python] 내장 시퀀스
True or False
2023. 6. 12. 08:02
컨테이너 시퀀스
서로 다른 자료형의 항목들을 담을 수 있는 list tuple collections.deque
균일 시퀀스
단 하나의 자료형만 담을 수 있는 str, bytes, array
균일 시퀀스가 컨테이너 시퀀스에 비해 메모리를 적게 사용함
가변시퀀스(내부 원소가 변할 수 있음)
- list
- array
- deque
- memoryview
불변시퀀스(내부 원소가 변하면 안됨)
- tuple
- str
- bytes
지능형 리스트
symbols = ‘abcde’
codes = [ord(symbol) for symbol in symbols if ord(symbol) > 25]
codes
# ascii 코드가 25가 넘는 것만 codes에 들어간다.
💡 참고
이전의 경우 지능형 리스트 안의 for 문에서 할당한 변수는 주변 범위에 다른 변수와 함께설정되어짐
현재는 고유한 지역범위를 가지기에 문제 발생하지 않음
💡 map / filter 를 사용하는 방법보다 지능형 리스트가 빠른경우가 있다
제너레이터 표현식
리스트를 만들지 않으며 한번 출력 후 사라짐
💡 튜플은 불변 리스트로 사용할 수도 있지만 필드명이 없는 레코드로 사용할 수 도 있다.
💡 튜플 언패킹을 사용 시 임시변수를 사용하지 않고도 두 변수의 값을 서로 교환 가능
💡 _ 가 의미하는 부분은 더미 변수를 플레이스홀더로 사용해서 관심없는 부분은 언패킹 할 때 무시한다.
💡 *의 경우 a, b, *rest = range(5) 처럼 1과2만 a,b에 할당이 되어지고 나머지는 *이 붙은 변수가 처리해줌
collections.namedtuple() 함수는 필드명과 클래스명을 추가한 튜플의 서브 클래스를 생성하는 팩토리 함수
불변 리스트로써의 튜플
삭제 추가 및 역순 제외하고는 리스트가 제공하는 메소드를 모두 지원
시퀀스 연산
피연산자를 변경하지 않고 객체를 새로만든다.
리스트의 리스트 만들기
#지능형 리스트를 이용해라
#(0)
board = [[’_’] * 3 for _ in range(3) ]
#(x)
board = [[’_’] * 3] * 3
# (동일한 객체를 참조하게 됨 )
💡 시퀀스 += 복합 할당 연산자가 작동하도록 만드는 특수 메소드는 iadd() 이다.
iadd() 가 구현되지 않았으면 자동으로 add() 를 호출한다.
불변시퀀스의 경우 해당하는 복합 할당 연산을 사용할 수 없다.
(정확히는 이전에 참조하던 객체가 아닌 새로운 객체를 만들고 거기에 값을 할당한다.)
복합 할당 연산자 iadd() imul()
💡 sort() 는 반환값이 없다 이유는 타겟 객체를 변경한다.
sorted() 의 경우 새로운 시퀀스를 반환한다. 모든 객체를 인수로 받을 수 있다.
reverse, key 인수
💡 bisect() 이진 검색 알고리즘, insort() 정렬된 시퀀스 안에 항목 삽입
bisect() 모듈보다 빠른 sortedcollection 비법
💡 만약에 숫자만 쓴다고 했을 경우 리스트 보다는 배열을 사용하자
리스트는 여러 자료형을 담을 수 있지만
배열은 한 자료형 만은 담는다. ⇒ 속도개선, 메모리 개선
메모리뷰
시퀀스에 메모리를 공유하는 객체 변경시에 기존에 있는 시퀀스도 변경이 되어진다.
덱
popleft() , rotate() 처럼 고유한 메소드를 추가로 가지고 있음
단점
중간 항목 삭제하는 연산은 그리 빠르지 않다.
장점
양쪽 끝에 추가나 제거하는 연산에 최적화되어 있다.
💡 append() 와 popleft() 메소드는 원자성을 갖고 있으므로
멀티스레드 앱에서 락을 사용하지 않고도 덱을 이용해서 간단히 fifo 큐를 구현할 수 있다.