Python Yield
yield
는 Python에서 generator를 만드는 데 사용되는 키워드로, 함수의 실행을 일시 중단하고 값을 반환하며, 필요할 때 함수의 상태를 그대로 유지하면서 실행을 재개할 수 있습니다. 이를 통해 메모리를 효율적으로 사용하면서도 데이터를 순차적으로 처리할 수 있게 합니다.
yield
를 이해하려면 우선 generator와 iterator의 개념을 알아야 합니다.
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. return
과 yield
의 차이
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. yield
와 for
루프
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
과 달리, 값을 반환한 후에도 함수의 실행 상태가 유지됩니다.
'Interview > Python' 카테고리의 다른 글
Python ASGI vs WSGI (3) | 2024.10.11 |
---|---|
Python GIL과 Thread (0) | 2024.10.10 |