Python 데코레이터와 제너레이터 이해하기

Python 데코레이터와 제너레이터 이해하기


목차

  1. 서론
  2. 데코레이터란 무엇인가?
    1. 데코레이터의 기본 개념
    2. 데코레이터 작성 및 사용법
    3. 여러 데코레이터의 사용
  3. 제너레이터란 무엇인가?
    1. 제너레이터의 기본 개념
    2. yield 키워드 사용법
    3. 제너레이터의 장점
  4. 데코레이터와 제너레이터의 실제 활용 예제
  5. 마무리
  6. 추천 태그

1. 서론

Python은 매우 유연한 언어로, 개발자가 코드의 재사용성과 유지보수성을 높일 수 있는 다양한 기능을 제공합니다. 그 중에서도 데코레이터와 제너레이터는 Python의 강력한 기능 중 하나입니다. 이번 포스팅에서는 데코레이터와 제너레이터의 개념과 사용법을 초보 개발자도 쉽게 이해할 수 있도록 설명하겠습니다.


2. 데코레이터란 무엇인가?


2.1 데코레이터의 기본 개념

데코레이터는 함수를 수정하지 않고 함수에 기능을 추가할 수 있는 강력한 도구입니다. 데코레이터는 다른 함수를 인수로 받아서 새로운 함수를 반환하는 함수입니다. 보통 함수의 전처리 또는 후처리를 수행할 때 사용됩니다.


2.2 데코레이터 작성 및 사용법

데코레이터를 작성하려면 내부에 함수를 정의하고, 그 함수를 반환하는 함수를 작성합니다. 데코레이터는 @ 기호를 사용하여 적용합니다.


# 데코레이터 정의
def my_decorator(func):
    def wrapper():
        print("함수 호출 전")
        func()
        print("함수 호출 후")
    return wrapper

# 데코레이터 사용
@my_decorator
def say_hello():
    print("Hello!")

say_hello()

위 예제에서 say_hello 함수는 my_decorator 데코레이터를 통해 호출 전과 후에 메시지를 출력합니다.


2.3 여러 데코레이터의 사용

여러 데코레이터를 사용할 수도 있습니다. 데코레이터는 위에서 아래로 적용됩니다.


def decorator1(func):
    def wrapper():
        print("데코레이터 1")
        func()
    return wrapper

def decorator2(func):
    def wrapper():
        print("데코레이터 2")
        func()
    return wrapper

@decorator1
@decorator2
def say_hello():
    print("Hello!")

say_hello()

위 예제에서 say_hello 함수는 decorator2가 먼저 적용되고, 그 다음에 decorator1이 적용됩니다.


3. 제너레이터란 무엇인가?


3.1 제너레이터의 기본 개념

제너레이터는 이터레이터의 한 종류로, yield 키워드를 사용하여 값을 하나씩 반환합니다. 제너레이터는 함수 내부에서 yield 키워드를 사용하여 정의합니다. 제너레이터는 값이 필요할 때까지 계산을 지연시키기 때문에 메모리를 효율적으로 사용할 수 있습니다.


3.2 yield 키워드 사용법

yield 키워드는 값을 반환하고, 함수의 상태를 유지한 채로 함수 실행을 일시 중단합니다. 다음 __next__() 호출 시점에서 중단된 지점부터 다시 실행을 시작합니다.


def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3

3.3 제너레이터의 장점

제너레이터는 메모리 효율성이 뛰어나고, 큰 데이터를 다룰 때 유용합니다. 또한, 복잡한 이터레이터를 간단하게 구현할 수 있습니다.


# 제너레이터를 사용한 큰 데이터 처리 예제
def count_up_to(max):
    count = 1
    while count <= max:
        yield count
        count += 1

counter = count_up_to(5)
for num in counter:
    print(num)

4. 데코레이터와 제너레이터의 실제 활용 예제


예제 1: 함수 실행 시간 측정 데코레이터

함수의 실행 시간을 측정하는 데코레이터를 작성해보겠습니다.


import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"실행 시간: {end_time - start_time:.4f}초")
        return result
    return wrapper

@timing_decorator
def example_function():
    time.sleep(2)
    print("함수가 실행되었습니다.")

example_function()

예제 2: 피보나치 수열 제너레이터

피보나치 수열을 생성하는 제너레이터를 작성해보겠습니다.


def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci()
for _ in range(10):
    print(next(fib))

5. 마무리

이번 포스팅에서는 Python의 데코레이터와 제너레이터에 대해 알아보았습니다. 데코레이터는 함수에 기능을 추가할 때, 제너레이터는 큰 데이터를 효율적으로 처리할 때 유용합니다. 다양한 예제를 통해 데코레이터와 제너레이터의 개념과 사용법을 익혀보시기 바랍니다.

이 포스팅이 Python을 처음 접하는 분들에게 도움이 되길 바랍니다.

다음 이전