Python의 yield 키워드: 이해하기 쉬운 예제와 함께
Python 프로그래밍을 하다 보면 yield 키워드를 마주치게 됩니다. 이 키워드는 처음 보면 이해하기 어려울 수 있지만, 실제로는 매우 유용하고 강력한 도구입니다.
오늘은 yield가 무엇이고, 어떻게 사용하며, 왜 중요한지 실행 가능한 예제와 함께 알아보겠습니다.
yield란 무엇인가?
yield
는 Python의 제너레이터(generator) 함수에서 사용되는 키워드입니다. 제너레이터는 이터레이터(iterator)를 생성하는 특별한 종류의 함수입니다. yield
를 사용하면 함수가 제너레이터 함수가 되며, 이는 일반 함수와는 다르게 동작합니다.
yield의 기본 사용법
먼저, 간단한 예제를 통해 yield
의 기본 사용법을 살펴보겠습니다:
def count_up_to(n):
i = 1
while i <= n:
yield i
i += 1
# 사용 예
for number in count_up_to(5):
print(number)
이 코드를 실행하면 다음과 같은 출력을 얻습니다:
1
2
3
4
5
이 예제에서 count_up_to
함수는 제너레이터 함수입니다. yield
를 사용하여 값을 하나씩 "생성"하고 반환합니다. 함수는 각 yield
문에서 실행을 일시 중지하고, 다음 요청 시 중단된 지점부터 다시 시작합니다.
yield vs return
yield
와 return
의 차이를 이해하기 위해 다음 예제를 살펴봅시다:
def return_numbers(n):
numbers = []
for i in range(1, n+1):
numbers.append(i)
return numbers
def yield_numbers(n):
for i in range(1, n+1):
yield i
# return 사용
print("Using return:")
for num in return_numbers(1000000):
if num < 5:
print(num)
else:
break
# yield 사용
print("\nUsing yield:")
for num in yield_numbers(1000000):
if num < 5:
print(num)
else:
break
이 코드를 실행하면 다음과 같은 출력을 얻습니다:
Using return:
1
2
3
4
Using yield:
1
2
3
4
두 함수는 같은 결과를 출력하지만, return_numbers
는 모든 숫자를 리스트에 저장한 후 반환하는 반면, yield_numbers
는 숫자를 하나씩 생성합니다. 대량의 데이터를 다룰 때 yield
를 사용하면 메모리 사용량을 크게 줄일 수 있습니다.
이 그림은 Python에서 `return`과 `yield` 키워드의 메모리 사용 패턴을 간단하게 비교하여 보여줍니다. 왼쪽의 'Return' 부분에서는 여러 개의 작은 사각형으로 모든 데이터가 한 번에 메모리에 로드되는 것을 나타내고 있으며, 오른쪽의 'Yield' 부분에서는 하나의 작은 사각형과 화살표로 현재 필요한 데이터만 메모리에 로드되는 것을 보여줍니다. 이를 통해 `return`이 모든 데이터를 한 번에 처리하여 많은 메모리를 사용하는 반면, `yield`는 데이터를 필요에 따라 하나씩 처리하여 메모리를 효율적으로 사용합니다.
yield의 실제 사용 예시
: 피보나치 수열
피보나치 수열을 생성하는 제너레이터 함수를 만들어 보겠습니다:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 사용 예
fib = fibonacci()
for _ in range(10):
print(next(fib))
이 코드를 실행하면 다음과 같은 출력을 얻습니다:
0
1
1
2
3
5
8
13
21
34
이 예제에서 fibonacci
함수는 무한한 피보나치 수열을 생성합니다. yield
를 사용하기 때문에 메모리를 효율적으로 사용하면서 필요한 만큼의 숫자만 생성할 수 있습니다.
결론
yield
키워드는 Python에서 이터레이터를 쉽게 만들 수 있게 해주는 강력한 도구입니다. 메모리 효율성, 지연 평가, 그리고 복잡한 이터레이터 로직의 간소화 등 많은 장점을 제공합니다.
위의 예제들을 직접 실행해보면서 yield
의 동작을 이해해보세요. 대용량 데이터 처리나 스트리밍 작업 등에서 특히 유용하게 사용될 수 있으므로, Python 프로그래머라면 반드시 알아둬야 할 개념입니다.
yield
의 더 복잡한 사용법과 고급 기능들도 있지만, 이 기본적인 이해만으로도 많은 상황에서 유용하게 활용할 수 있을 것입니다. Python 프로그래밍의 효율성과 우아함을 높이고 싶다면, yield
의 사용을 적극 고려해 보세요!