Interview/Python

Python Yield

김 정출 2024. 10. 13. 22:58

Python Yield

yield는 Python에서 generator를 만드는 데 사용되는 키워드로, 함수의 실행을 일시 중단하고 값을 반환하며, 필요할 때 함수의 상태를 그대로 유지하면서 실행을 재개할 수 있습니다. 이를 통해 메모리를 효율적으로 사용하면서도 데이터를 순차적으로 처리할 수 있게 합니다.

yield를 이해하려면 우선 generatoriterator의 개념을 알아야 합니다.

1. Generator

yield를 사용하는 함수는 generator 객체를 반환합니다. 이 generator는 __iter__()__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

2. returnyield의 차이

  • return: 함수는 호출되면 결과를 반환하고 실행이 끝나며, 다음에 함수를 호출하면 처음부터 다시 실행됩니다.
  • yield: 함수를 중단시켜 값을 반환하지만, 그 시점에서 함수의 상태를 저장해 둡니다. 다음 호출 시 저장된 상태에서 다시 실행이 재개됩니다.
def my_function():
    return 1
    return 2  # 실행되지 않음

def my_generator():
    yield 1
    yield 2  # 실행됨

3. 메모리 효율성

yield를 사용하는 generator는 큰 데이터를 처리할 때 메모리 효율적입니다. 예를 들어, 리스트를 한 번에 모두 메모리에 올리는 대신, 필요한 값을 하나씩 생성해서 처리할 수 있습니다.

def count_up_to(max):
    count = 1
    while count <= max:
        yield count
        count += 1

for num in count_up_to(5):
    print(num)

위의 코드는 한 번에 모든 숫자를 메모리에 로드하지 않고, 필요한 순간에 하나씩 생성하여 출력합니다.

4. yieldfor 루프

yield를 사용하는 함수는 for 루프와 함께 자연스럽게 사용됩니다. for 루프는 generator 객체를 받아 그 안의 값을 순차적으로 반복합니다.

def generate_numbers():
    for i in range(5):
        yield i

for num in generate_numbers():
    print(num)

5. yield from

yield from은 다른 generator를 호출하거나 이터러블 객체를 반복할 때 사용되는 구문입니다. 반복 작업을 좀 더 간결하게 표현할 수 있습니다.

def sub_generator():
    yield 1
    yield 2

def main_generator():
    yield from sub_generator()  # sub_generator의 모든 값을 yield
    yield 3

for value in main_generator():
    print(value)

요약

  • yield는 Python에서 함수의 상태를 저장하면서 중단과 재개가 가능한 generator를 만들기 위한 키워드입니다.
  • 메모리 효율적으로 데이터를 순차적으로 처리할 수 있어, 대규모 데이터 처리나 무한 시퀀스를 다룰 때 유용합니다.
  • return과 달리, 값을 반환한 후에도 함수의 실행 상태가 유지됩니다.