Python

Python - 데코레이터와 제너레이터

thebasics 2024. 10. 28. 17:00

목차

  1. 데코레이터와 제너레이터란?
  2. 함수 데코레이터
    • 데코레이터의 개념
    • 데코레이터의 구현과 활용
    • 내장 데코레이터
  3. 제너레이터
    • 제너레이터의 개념
    • yield의 사용법
    • 제너레이터의 활용
  4. 예시 코드
  5. 결론
  6. 관련 자료 및 추가 학습 자료

1. 데코레이터와 제너레이터란?

데코레이터와 제너레이터는 Python의 고급 기능으로, 코드의 모듈화와 효율성을 크게 향상시킵니다.

  • 데코레이터는 기존 함수나 메서드의 동작을 수정하지 않고 기능을 확장하거나 수정할 수 있도록 해주는 도구입니다. 이를 통해 코드의 중복을 줄이고, 함수의 재사용성을 높일 수 있습니다.
  • 제너레이터는 이터레이터의 한 종류로, 메모리를 효율적으로 사용하면서 큰 데이터를 처리할 수 있도록 합니다. 제너레이터는 yield 키워드를 사용하여 값을 하나씩 생성하며, 필요한 시점에 값을 생성하기 때문에 메모리 사용량을 줄일 수 있습니다.

2. 함수 데코레이터

데코레이터의 개념

데코레이터는 함수를 인수로 받아 새로운 함수를 반환하는 함수입니다. 데코레이터를 사용하면 기존 함수에 새로운 기능을 추가하거나 수정할 수 있으며, 이를 통해 코드의 가독성과 재사용성을 높일 수 있습니다.

  • 구문:
    def decorator_function(original_function):
        def wrapper_function():
            # 추가 기능
            original_function()
            # 추가 기능
        return wrapper_function
  • 적용 방법:
    @decorator_function
    def display():
        print("Display function ran")

데코레이터의 구현과 활용

데코레이터는 주로 로깅, 권한 검사, 입력 검증 등 다양한 상황에서 사용됩니다.

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

    import time
    
    def timer_decorator(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            result = func(*args, **kwargs)
            end_time = time.time()
            print(f"{func.__name__} 실행 시간: {end_time - start_time:.4f} 초")
            return result
        return wrapper
    
    @timer_decorator
    def display_message():
        time.sleep(1)
        print("Hello, World!")
    
    display_message()
    • 위 코드는 timer_decorator를 사용하여 display_message 함수의 실행 시간을 측정하고 출력합니다.

내장 데코레이터

Python은 몇 가지 내장 데코레이터를 제공합니다.

  • @staticmethod: 클래스 내에서 인스턴스나 클래스에 의존하지 않는 메서드를 정의할 때 사용합니다.

    class MathOperations:
        @staticmethod
        def add(a, b):
            return a + b
    
    print(MathOperations.add(5, 3))  # 8
  • @classmethod: 클래스 메서드를 정의할 때 사용하며, 첫 번째 인자로 클래스 자체를 받습니다.

    class Person:
        count = 0
    
        def __init__(self, name):
            self.name = name
            Person.count += 1
    
        @classmethod
        def get_count(cls):
            return cls.count
    
    p1 = Person('Alice')
    p2 = Person('Bob')
    print(Person.get_count())  # 2

3. 제너레이터

제너레이터의 개념

제너레이터는 일반 함수와 달리 값을 반환하는 것이 아니라, 값을 생성하고 필요할 때마다 하나씩 반환합니다. 이를 통해 제너레이터는 큰 데이터셋을 처리하거나 메모리 효율을 높여야 할 때 유용하게 사용할 수 있습니다.

  • 구문:
    def generator_function():
        yield 값

yield의 사용법

yield 키워드를 사용하면 함수가 제너레이터가 됩니다. yield는 함수의 실행을 일시 중지하고, 호출자에게 값을 반환하며, 다음 호출 시 중지된 지점부터 실행을 재개합니다.

  • 예시:

    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)
    • 이 코드는 1부터 5까지의 숫자를 생성하는 제너레이터를 정의하고, for 루프를 통해 각 값을 순차적으로 출력합니다.

제너레이터의 활용

제너레이터는 특히 대용량 데이터 처리나 무한 시퀀스를 생성할 때 유용합니다.

  • 예시: 큰 데이터 처리:

    def read_large_file(file_path):
        with open(file_path) as file:
            for line in file:
                yield line
    
    for line in read_large_file('large_file.txt'):
        print(line.strip())
    • 제너레이터를 사용하여 대용량 파일을 한 줄씩 읽어 메모리 사용을 최소화합니다.
  • 예시: 무한 시퀀스 생성:

    def infinite_sequence():
        num = 0
        while True:
            yield num
            num += 1
    
    for i in infinite_sequence():
        print(i)
        if i > 10:
            break
    • 무한한 숫자 시퀀스를 생성하는 제너레이터로, 필요할 때마다 값을 생성하고 반환합니다.

4. 예시 코드

데코레이터로 함수 실행 시간 측정

import time

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

@timer_decorator
def calculate_square(n):
    return n * n

print(calculate_square(5))

제너레이터를 사용한 데이터 처리

def fibonacci_sequence(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

fib_gen = fibonacci_sequence(10)
for num in fib_gen:
    print(num)

5. 결론

데코레이터와 제너레이터는 Python의 고급 기능으로, 코드의 모듈화와 효율성을 향상시킵니다. 데코레이터는 기존 함수나 메서드에 새로운 기능을 추가하거나 수정할 수 있는 강력한 도구로, 코드를 더욱 간결하고 재사용 가능하게 만들어 줍니다. 제너레이터는 yield 키워드를 사용하여 필요한 시점에 값을 생성하고 반환함으로써 메모리를 효율적으로 사용하고, 큰 데이터셋을 처리할 때 유용합니다. 이러한 기능을 잘 활용하면 복잡한 문제를 더욱 간단하고 효율적으로 해결할 수 있습니다.


6. 관련 자료 및 추가 학습 자료


이 글에서는 Python의 함수 데코레이터와 제너레이터에 대해 살펴보았습니다. 데코레이터를 통해 함수의 기능을 확장하고, 제너레이터를 통해 메모리를 효율적으로 사용하며 큰 데이터셋을 처리하는 방법을 배웠습니다. 이러한 고급 기능을 활용하여 Python 코드를 더욱 효율적이고 모듈화된 방식으로 작성해 보세요.

반응형

'Python' 카테고리의 다른 글

Python - 에러 처리 심화  (1) 2024.10.30
Python - 고급 데이터 조작  (5) 2024.10.29
Python - 객체 지향 프로그래밍 심화  (3) 2024.10.27
Python - 코드 디버깅  (6) 2024.10.26
Python - 기본 라이브러리 사용  (10) 2024.10.25