"fluent python" 2장을 정리한 내용입니다.
Pythonic한 연산:
Python에서 제공하는 시퀸스를 이해하면 코드르 새로 구현할 필요가 없는 Pythonic한 코드 작성이 가능해진다. 따라서, 이장에서는 Python의 시퀸스에 대해서 알아본다.
파이썬 표준 라이브러리는 c로 구현된 시퀸스 형을 제공
자료형
컨테이너 시퀸스 :
균일 시퀸스 :
**균일 시퀸스가 메모리를 적게 사용하지만, 기본 자료형 만 담을 수 있다.
symbols = '&^%@$1*'
codes = [ord(symbol) for symbol in symbols]
x = 'abc'
dummy = [ord(x) for x in x ]
print (x) # >>> 'abc'
print(dummy) >>> '65,66,67'
symbols = '&^%@$1*'
tuple(ord(symbol) for symbol in symbols)
레코드로서의 튜플 : 필드의 집합으로써 항목과 순서를 고려하여 이용
튜플 언패킹
- 반복이 가능한 객체라면 어느 객체든 이용 가능
- 초과 항목을 잡기위해 사용하는 *경우가 아니라면, 반복 가능한 객체는 한번에 하나의 항목만을 생성
- interable unpacking
- 병렬할당 paralle assignment : 반복형 데이터를 변수로 구성된 튜플에 할당
- 임시변수를 사용하지 않고 값 교환
- 호출자에 여러값을 간단히 반환하는 경우
예제) 더미변수를 플레이스홀더로 사용, 관심없는 부분 언패킹 무시
import os
_, filename = os.path.split("home/hsy/.ssh/filename.pub")
>>> filename
일부 항목에만 관심이 있는 경우 ( 초과 항목 잡기 위한 사용)
함수의 매개변수에 를 붙여서 이용, 어떤 매개변수라도 이용 가능
병렬할당의 경우 단하나의 매개변수에만 * 이용 가능
내포된 튜플 언패킹 : 언패킹할 표현식을 튜플은 (a,b,(c,d)) 처럼 다른 튜플을 내포할 수 있음
collections.namedtuple(): 필드명과 클래스명을 추가한 튜플의 서브 클래스 -> 디버깅시에유용
함수의 필드명과 클래스명을 추가한 튜플의 서브클래스 생성 팩토리 함수 → 디버깅시 유용 (참고 - https://www.geeksforgeeks.org/difference-between-dataclass-vs-namedtuple-vs-object-in-python/ )
슬라이스 범위 지정시에 마지막 항목이 포함되지 않는 이유
슬라이스 객체 : seq[start:stop:steop] - > seq._ getitem _(slice(strat, stop, step))
각 슬라이스마다 이름을 붙이고 이를 for 문에 이용할 시에 좋아지는 가독성
다차원 슬라이싱 생략 기호
1. 연산자는 콤마로 구분해서 여러개의 인덱스나 슬라이스를 가질 수 있음
2. 연산자는 _ getitem , _setitem__ 의 magic method에서 인덱스를 튜플로 받음
… eplipsis 객체 : Numpy 확장 패키지 지원
슬라이싱 , 정보 추출및 가변 시퀸스 값을 변경
(새로 만드는 것이 아니라 일부 항목값을 시퀸스 안에서 직접 변경)
시퀸스에 * 나 + 연산자가활용 가능
리스트의 리스트 : 내포된 리스트를 초기화 해야하는 경우
board_1 = [['_'] * 3 for i in ragne(3)]
board_2 = [['_'] * 3 ] * 3
>>> board_2 는 모두 동일한 객체를 참조하고 있음
>>> board_1 은 모두 다른 객체가 참조되고 있음
참조과 가변 객체 주의해서 이용
_ note:
파이썬에서는 객체를 직접 변경하는 함수나, 메서드는 객체가 변경되었고 새로운 객체가 생성 되지 않았음을 호출자에게 알려주기위해 None 반환, 이런경우 메서드를 연결해서 호출 할 수 없다는 단점이 있음 (참고 - https://en.wikipedia.org/wiki/Fluent_interface )
_ Note:
item in collections처럼 어떤 항목이 있는지 검사하는 작업을 많이 수해아며, 항목수가 아주 많은 경우에는 set형을 구현하는 것을 고려하면 좋다. set은 항목이 들어있는지 겁사하는데 최적화 되어있지만, 순서가 없으며 시퀸스가 아니라는 점을 고려하며 코딩하여야 한다..!