본문 바로가기
FnQ

Python의 yield 키워드: 이해하기 쉬운 예제와 함께

by codeai 2024. 7. 3.

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

yieldreturn의 차이를 이해하기 위해 다음 예제를 살펴봅시다:

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의 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의 사용을 적극 고려해 보세요!