ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 - 제너레이터 / 데커레이터
    python 2021. 3. 19. 21:05

    제너레이터generator

    제너레이터는 파이썬의 시퀀스를 생성하는 객체다. 제너레이터로 전체 시퀀스를 한 번에 메모리에 생성하고 정렬할 필요 없이, 잠재적으로 큰 시퀀스를 순회할 수 있다. 제너레이터는 이터레이터에 대한 데이터의 소스로 자주 사용된다. my_range() 함수는 제너레이터다(일련의 정수를 생성한다).

     

    제너레이터는 실행될 때 함수를 실행하는 것이 아니라, 제너레이터 함수가 가진 객체를 반환한다. 

    제너레이터는 한번 생성해서 반환한 객체를 보관하지 않기 때문에, 이전의 코드를 실행한 후 추가한 코드를 실행하면 객체가 출력되지 않는다.

     

    제너레이터를 순회할 때마다 마지막으로 호출된 항목을 기억하고 다음 값을 반환한다. 제너레이터는 일반 함수와 다르다. 일반 함수는 이전 호출에 대한 메모리가 없고, 항상 똑같은 상태로 첫 번째 라인부터 수행한다.

     

    잠재적으로 큰 시퀀스를 생성하고, 제너레이터 컴프리헨션에 대한 코드가 아주 긴 경우에는 제너레이터 함수를 사용하면 된다. return 문으로 값을 반환하지 않고, yield 문으로 값을 반환한다.  

    >>> def my_range(first=0, last=10, step=1):
    ...     number = first
    ...     while number < last:
    ...         yield number
    ...         number += step
    
    다음과 같이 함수를 실행한다
    >>> my_range
    <function my_range at 0x00000168277BF280>
    
    다음과 같이 제너레이터 객체를 반환한다.
    >>> ranger = my_range(1,5)
    >>> ranger
    <generator object my_range at 0x0000016827800270>
    
    이 제너레이터 객체를 순회할 수 있다.
    >>> for x in ranger:
    ...     print(x)
    ...
    2
    3
    4

     


    데커레이터 decorator

     

    가끔씩 소스 코드를 바꾸지 않고, 사용하고 있는 함수를 수정하고 싶을 때가 있다. 일반적인 예는 함수에 전달된 인자를 보기 위해 디버깅 문을 추가하는 것이다.

     

    데커레이터는 하나의 함수를 취해서 또 다른 함수를 반환하는 함수다. 이 묘책을 사용하기 위해서는 다음과 같은 것들을 사용한다.

    - *args와 **kargs

    - 내부 함수

    - 함수 인자

     

     

    document_it() 함수는 다음과 같이 데커레이터를 정의한다.

    - 함수 이름과 인자값을 출력한다

    - 인자로 함수를 실행한다.

    - 결과를 출력한다.

    - 수정된 함수를 사용할 수 있도록 반환한다.

     

    >>> def document_it(func):
    ...     def new_function(*args, **kargs):
    ...         print('Running function: ', func.__name__)
    ...         print('Positional arguments: ', args)
    ...         print('Keyword argument: ', kwargs)
    ...         result = func(*args, **kargs)
    ...         print('Result: ', result)
    ...         return result
    ...     return new_function

     

    document_it() 함수에 어떤 func 함수 이름을 전달하든지 간에 document_it() 함수에 추가 선언문이 포함된 새 함수를 얻는다. 데커레이터는 실제로 func 함수로부터 코드를 실행하지 않는다. 하지만 document_it() 함수로부터 func를 호출하여 결과뿐만 아니라 새로운 함수를 얻는다.

     

    수동으로 데커레이터를 적용해보자.

    >>> def add_ints(a,b):
    ...     return a+b
    ...
    >>> add_ints(3, 5)
    8
    >>> cooler_add_ints = document_it(add_ints)
    >>> cooler_add_ints(3,5)
    Running function: add_ints
    Positional arguments: (3,5)
    Keyword arguments: {}
    Result: 8
    8

    위와 같이 수동으로 데커레이터를 할당하는 대신, 다음과 같이 데커레이터를 사용하고 싶은 함수에 그냥 @데커레이터_이름을 추가한다.

    >>> @document_it
    ... def add_ints(a,b):
    ...     return a+b
    ...
    >>> add_ints(3,5)
    Running function: add_ints
    Positional arguments: (3,5)
    Keyword arguments: {}
    Result: 8
    8

     

    출처 : Introducing python

    'python' 카테고리의 다른 글

    계산기 프로그램 만들기 (파이썬, 후위 계산)  (0) 2022.02.20
    파이썬 - News categorization  (0) 2021.03.22
    파이썬 - docstring  (0) 2021.03.19
    파이썬 - 이터레이터  (0) 2021.03.18
    파이썬 - 람다 함수  (0) 2021.03.16
Designed by Tistory.