2. An Array of Sequences

ve.log·2022년 11월 13일
0

python

목록 보기
2/3

"fluent python" 2장을 정리한 내용입니다.

Pythonic한 연산:

  1. 시퀸스에 대한 범용 연산, 단일하게 처리
    -> 문자열, 리스트, 바이트 시퀸스, 배열, XML, 데이터 베이스에 대하여 모두 반복, 슬라이싱 정렬, 연결 등 공통 연산 적용 가능
  2. 튜플과 매칭 자료형
  3. 들여쓰기를 이용한 구문 구조
  4. 변수를 선언하지 않고 자료 검사

Python에서 제공하는 시퀸스를 이해하면 코드르 새로 구현할 필요가 없는 Pythonic한 코드 작성이 가능해진다. 따라서, 이장에서는 Python의 시퀸스에 대해서 알아본다.

1. Built-in Sequences

  • 파이썬 표준 라이브러리는 c로 구현된 시퀸스 형을 제공

  • 자료형

  1. 컨테이너 시퀸스 :

    • 서로 다른 자료형의 항목을 담을 수 있음
    • 종류 : list, tuple, collections, deque
    • 특징 : 객체에 대한 참조를 담고 있으며, 어떠한 자료형도 객체가 될 수 있다.
  2. 균일 시퀸스 :

    • 단 하나의 자료형 만 듬을 수 있음
    • 종류 : str, bytes, bytearay, memoryview, array.array
    • 특징 : 객체에 대한 참조 대신에, 자신의 메모리 공간에 각 항목 값을 직접 담는다.

    **균일 시퀸스가 메모리를 적게 사용하지만, 기본 자료형 만 담을 수 있다.

  • 가변성
  1. 가변 시퀸스 : list, bytearraym, array.array, collections, deque, momoryview
  2. 불변 시퀸스 : tuple, str, bytes
  • 가변시퀸스와 불변시퀸스가 상속하는 메서드가 다르기 때문에, 제공하는 기능이 달라짐
  • 리스트는 가변적이며 혼합된 자료를 담을 수 있고, 제너레이터 표현식을 이용하면 다양한 자료형의 시퀸스도 쉽게 이용 가능

2. List comprehension and Generator Expression

  • 리스트를 생성할 때, 빈 리스트를 생성하지 않고 generator expression을 이용하여 생성
	symbols = '&^%@$1*'
	codes = [ord(symbol) for symbol in symbols]
  • 특징
    1. 지능형 리스트, 제너레이터 표현식, 지능형 집합, 지능형 딕셔너리는 함수처럼 고유한 지역 범위를 가진다
	x = 'abc' 
	dummy = [ord(x) for x in x ]
	print (x)  # >>> 'abc'
	print(dummy) >>> '65,66,67'
  1. 표현식 안에서는 할당되나 변수는 지역변수
  2. 주변 범위의 변수를 여전히 참조 가능
  3. 지역변수가 주변변수를 가리지 않는다
  4. 항목 필터링 및 변환, 시퀸스나 기타 반복 가능한 자료로부터 리스트 생성
  • lambda에 map()/ filter()을 조합하여 만드는 것과 동일

3. Generator Expression

  • 리스트 외 다른 종류의 시퀸스를 채우려고 할때 이용
  • 튜플, 배열 등의 시퀸스 형을 초기화 → 지능형 리스트 사용 가능
  • 다른 생성자에 전달할 리스트를 통째로 만들지 않고 반복자 프로토콜을
    ( iterator protocol ) 을 이용하여 항목을 하나씩 생성 → 메모리 적게 이용
  • 대괄호 대신 괄호 이용
   	symbols = '&^%@$1*'
	tuple(ord(symbol) for symbol in symbols)
  • 메모리를 유지 할 필요가 없는 데이터를 생성할때

4. Tuples are not Just Immutable Lists

  • 레코드로서의 튜플 : 필드의 집합으로써 항목과 순서를 고려하여 이용

  • 튜플 언패킹
    - 반복이 가능한 객체라면 어느 객체든 이용 가능
    - 초과 항목을 잡기위해 사용하는 *경우가 아니라면, 반복 가능한 객체는 한번에 하나의 항목만을 생성
    - 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/ )

5. Slicing

  • 슬라이스 범위 지정시에 마지막 항목이 포함되지 않는 이유

    1. 중단점만 이용해서 슬라이스나 범위를 지정할 때 길이 계산 이 쉬움
    2. 시작점과 중단점을 모두 지정할 때
    3. 인덱스를 기준으로 겹침없이 시퀸스를 분할하기 쉽기 때문
  • 슬라이스 객체 : 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 은 모두 다른 객체가 참조되고 있음

    참조과 가변 객체 주의해서 이용

6. list.sort vs the sorted Built-in

  • list.sort()
    1. 사본을 만들지 않고 리스트 내부를 변경하여 정렬
    2. 타깃 객체를 변경하고 새로운 리스트를 생성하지 않았음을 알려주기 위해 None 반환

_ note:
파이썬에서는 객체를 직접 변경하는 함수나, 메서드는 객체가 변경되었고 새로운 객체가 생성 되지 않았음을 호출자에게 알려주기위해 None 반환, 이런경우 메서드를 연결해서 호출 할 수 없다는 단점이 있음
(참고 - https://en.wikipedia.org/wiki/Fluent_interface )

  • sorted()
    1. 새로운 리스트를 만들어서 반환
    2. 불변 시퀸스 및 제너레이터를 포함해서 반복 가능한 모든 객체를 인수로 받을 수 있음
    3. 반복 가능한 객체의 자료형과 무관하게, 언제나 새로 생성한 리스트를 반환
  • list.sort() 메서드와 sorted() 함수 모두 선택적으로 두개의 인수를 받음
    1.reverse : 참비교연산을 반대로해서 내림차순 반환
    2.key : 정렬에 사용할 키를 생성하기 위해 각 항목에 적용할 함수를 인수로 받음
  • 효율적으로 검색하기위해 sort 이용

7. When a List is Not the Answer

  • 리스트는 다양한 자료형을 담을 수 있다는 점에서 flexible한 장점이 있음
  • 실수 천만개를 저장해야 하는경우, 바이트값만 저장하는 배열이 더 효과적임
  • 리스트의 양쪽 끝에 항목을 계속 추가하거나 삭제하면서 FIFO, LIFO데이터 구조를 구현할 떄는 deque가 더 효과적이다.

_ Note:
item in collections처럼 어떤 항목이 있는지 검사하는 작업을 많이 수해아며, 항목수가 아주 많은 경우에는 set형을 구현하는 것을 고려하면 좋다. set은 항목이 들어있는지 겁사하는데 최적화 되어있지만, 순서가 없으며 시퀸스가 아니라는 점을 고려하며 코딩하여야 한다..!

8. Summary

  • 표준 라이브러리에서 제공하는 시퀸스 형을 제대로 파악하고 있어야, 간결한 코드가 작성 가능하다.
  • 파이썬 시퀸스는 가변과 불변으로 구분하기도 하지만, 균일 시퀸스, 컨테이너 시퀸스로 분류하는 것도 도움이 된다.
  • 지능형 리스트와 제너레이터 표현식은 시퀸스를 생성하고 초기화 하는 강력한 표기법이다.
  • 튜플은 필드이름이 생략된 레코드 및 불변 리스트로서 이용가능하다.
  • 튜플 언패킹에서 언패킹이 필드에 접근하는 안전한 방법이며 * 구문을 이용하여 선택적으로 필드를 처리하는 것에 익숙해 지면 좋다.
  • 슬라이싱은 파이썬에서 강력한 기능이므로 반드시 알아두어야 한다.
  • sort()와 sorted()는 내장 함수로 이용하기 쉽다.
profile
AI Engineer

0개의 댓글