Python 데코레이터와 제너레이터 이해하기
목차
- 서론
- 데코레이터란 무엇인가?
- 데코레이터의 기본 개념
- 데코레이터 작성 및 사용법
- 여러 데코레이터의 사용
- 제너레이터란 무엇인가?
- 제너레이터의 기본 개념
yield
키워드 사용법- 제너레이터의 장점
- 데코레이터와 제너레이터의 실제 활용 예제
- 마무리
- 추천 태그
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을 처음 접하는 분들에게 도움이 되길 바랍니다.