목차
- 데코레이터와 제너레이터란?
- 함수 데코레이터
- 데코레이터의 개념
- 데코레이터의 구현과 활용
- 내장 데코레이터
- 제너레이터
- 제너레이터의 개념
yield
의 사용법- 제너레이터의 활용
- 예시 코드
- 결론
- 관련 자료 및 추가 학습 자료
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
루프를 통해 각 값을 순차적으로 출력합니다.
- 이 코드는 1부터 5까지의 숫자를 생성하는 제너레이터를 정의하고,
제너레이터의 활용
제너레이터는 특히 대용량 데이터 처리나 무한 시퀀스를 생성할 때 유용합니다.
예시: 큰 데이터 처리:
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 공식 문서 - 데코레이터: https://docs.python.org/3/glossary.html#term-decorator
- 국가기관 및 보고서
- NIST (국립 표준 기술 연구소) - Python 프로그래밍 및 메모리 관리 가이드: NIST Publications
- 추천 도서
- 블로그 및 기타 자료
- Real Python - Python Decorators: https://realpython.com/primer-on-python-decorators/
- Real Python - Understanding Generators in Python: https://realpython.com/introduction-to-python-generators/
- geeksforgeeks - Decorators in Python: https://www.geeksforgeeks.org/decorators-in-python/
이 글에서는 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 |