9강 파이썬의 독특하나 기능들

Han Hanju·2022년 4월 21일
0
post-thumbnail

9.1 제너레이터 - 메모리 효율이 높은 이터러블 객체

  • 이터러블 객체
  • 리스트, 튜플: 메모리 사용량이 커지는 단점
  • 제너레이터: 필요한 순간 생성해서 반환 (메모리 사용량이 적다)

1 제너레이터의 구체적 예시

  • 제너레이터의 경우 무한반복이 가능

2 제너레이터 구현

  • 제너레이터 함수 - 함수와 같이 작성

    • yield 식을 사용한 함수

    • 반환값은 제너레이터 이터레이터

    • 특수메서드 next()호출 시 마다 함수 안의 처리가 다음 yield식 까지 수행됨

    • 함수를 벗어나면 StopIteration 예외 발생

    • 반환값이 이터레이션이므로 for문, 컴프리헨션 인수에 사용가능

  • 제너레이터 식 - 컴프리헨션을 이용해 작성

    • [] 대신 ()를 사용
    • 각 엘리먼트는 필요할때까지 계산되지 않는다.
    • 함수호출시 전달할 인수가 제너레이트식 하나일뿐일때는 컴프리헨션의 ()가 생략이 가능하다.
  • yield from 식 - 서브 제너레이터로 처리를 이첩

    • 제너레이터의 내부에서 추가로 제너레이터를 만들 경우

3 제너레이터 이용시 주의점

  • 리스트나 튜플처럼 이터러블로 이용 가능
  • zip(), filter()에 전달 가능
  • len()에서 이용시
    • TypeError 발생
    • 리스트나 뉴플로 변환해 사용
    • 거대한 값이나 무한한 값은 list 변환시 무한루프
  • 여러 차례 이용시
    • 제너레이터는 상태를 유지
    • 리스트나 튜플로 변환한것을 유지

4 제너레이터 실제 사례 - 파일 내용 변환하기

  • 파일 내용을 한행씩 읽어 대문자로 변환
  • 파일을 한행씩 읽는 제너레이터 함수 reader()

5 기타 이용사례

  • 데이터 분석, 머신러닝 등 대량의 텍스트 데이터 또는 이미지 파일을 다룰때 굉장히 많이 사용

9.2 데커레이터 - 함수나 클래스명에 처리 추가

  • 함수나 클래스 앞뒤에 처리를 추가 할 수 있는기능
  • 용도
    • 함수 인수체크
    • 함수 호출 결과 캐시
    • 함수 실행시간 측정
    • web api에서 핸들러 등록, 로그인 상태에 따른 제한

1. 데커레이터의 구체적인 예시

  • functools.lru_cashe() - 함수의 결과를 캐시하는 함수 데커레이터

  • dataclasses.dataclass() - 자주하는 처리를 자동으로 추가하는 클래스 데커레이터

    • frozen=True값을 삽입하여 읽기전용으로 만들어줌

2. 데커레이터 구현

  • 간단한 데커레이터
  • 함수데커레이터: 함수 하나를 인수로 받는 호출이 가능한 객체
  • 함수 f의 호출 전후로 로그 출력하는 데커레이터
  • 인수가 있으면 에러
  • 인수를 받는 함수 데커레이터
  • 데커레이터 자체가 인수를 받는 데커레이터
    • @lru_cache(maxsize=32) 와 같이 데커레이터에서 인수를 받을 수 있다.
  • 여러 데커레이터를 동시에 이용
  • functools.wraps()로 데커레이터 결함 해결
    • 데커레이터를 사용하면 디버깅시 모두 같은 이름의 함수 호출됨
    • @wraps: 실제로 실행될 함수의 이름이나 독스트링을 원래 함수의 것으로 치환

3. 데커레이터 실제 사례 - 처리 시간 측정

9.3 콘텍스트 관리자 - with문 앞뒤에서 처리를 실행하는 객체

1. 콘텍스트 관리자의 구체적인 예시

  • 콘텍스트 관리자 구현

  • __enter__(), __exit__() - with문 앞뒤에서 호출하는 메서드

    • __enter__(): with 블록에 들어갈때 호출하는 전처리
    • __exit__(): with 블록을 벗어날때 호출하는 후처리
  • with문과 예외처리

    • 예외시 __exit__()의 변수에 해당정보 전달
    • 따로 raise문이 필요없고 예외 발생시 트레이스백 정보를 표시
  • as키워드 - __enter__()의 반환값을 이용

    • 임의값을 특수메서드 __exit__()에 직접전달은 안되고 아래와같이 인스턴스변수 등을 통해 전달
  • contextlib.contextmanager로 간단하게 구현

    • 정형처리를 캡슐화

2. 콘텍스트 관리자 실제 사례 - 일시적인 로깅 수준 변경

9.4 디스크립터 - 속성 처리를 클래스로 이첩

1. 디스크립터의 구체적인 예시

  • 특수메서드 __get()__, __set__(), __delete__() 중 하나 이상을 가지고 있다면 디스크립터
    • 데이터 디스크립터: __set__(), __delete__() 둘다 혹은 둘중 하나를 가지고 있는경우
    • 비 데이터 디스크립터 __get()__만 가지고 있는경우

2. 디스크립터 구현

  • __set__()구현 - 데이터 디스크립터
    • 오버라이드 디스크립터라고도 불린다.
    • __set_name__()은 인스턴스화 할때
    • __set__()은 대입시 호출된다.
      _ __get__()은 취득시 호출
  • __get__()만 구현 - 비데이터 디스크립터
    • 비오버라이드 디스크립터라고도 불린다.
    • 우선도는 인스턴스변수보다 낮다.
      -
      -
      -
      \
profile
Data Analytics Engineer

0개의 댓글