Tech & Development/Programming Languages

[Python] 제너레이터 (Generator)

Theo (테오) 2024. 11. 18. 00:04
반응형

Python에서 제너레이터(Generator)는 큰 데이터를 메모리에 효율적으로 처리할 수 있게 도와주는 특별한 이터레이터입니다. 일반적인 함수와 달리, 제너레이터는 값을 한 번에 하나씩 반환하고, 매번 호출될 때 이전 상태를 기억합니다. 제너레이터는 yield 키워드를 사용하여 값을 반환하며, return을 사용하면 더 이상 값을 생성하지 않고 종료됩니다

제너레이터의 특징

  1. 메모리 효율성: 제너레이터는 값을 필요할 때마다 하나씩 생성하므로, 큰 데이터를 처리할 때 메모리를 아낄 수 있습니다.
  2. Lazy Evaluation(지연 평가): 모든 값을 한꺼번에 생성하지 않고, 요청할 때마다 값을 생성하여 반환합니다.
  3. 상태 유지: yield 키워드 덕분에 함수의 상태가 유지되며, 중단된 위치에서 다시 시작할 수 있습니다.

기본 예제: 간단한 제너레이터 함수

아래의 예제는 yield를 사용하여 1부터 3까지의 값을 하나씩 반환하는 제너레이터 함수입니다.

def simple_generator():
    yield 1
    yield 2
    yield 3

for value in simple_generator():
    print(value)
# 출력:
# 1
# 2
# 3

yield가 호출될 때마다 함수의 상태를 기억하며, 다음 for 루프에서 호출하면 이전 위치에서 다시 시작합니다.

제너레이터로 큰 데이터 처리하기

일반적으로 range() 함수를 사용할 때 큰 범위를 다루게 되면 많은 메모리를 차지하게 됩니다. 이럴 때 제너레이터를 사용하면 효율적으로 메모리를 사용할 수 있습니다.

def large_range(n):
    for i in range(n):
        yield i

for number in large_range(100):
    print(number)
# 이 예제에서는 0부터 100까지의 값을 생성하면서, 매번 하나씩 출력합니다.

제너레이터 표현식

제너레이터 표현식은 리스트 내포와 비슷한 문법을 사용하여 간단히 제너레이터를 생성할 수 있습니다. () 괄호를 사용해 리스트 내포를 제너레이터로 변환합니다.

squared_numbers = (x**2 for x in range(5))
for num in squared_numbers:
    print(num)
# 출력:
# 0
# 1
# 4
# 9
# 16

yieldreturn의 차이점

  • yield는 값을 반환하면서 함수의 상태를 유지하고, 다음에 호출될 때 이어서 실행됩니다.
  • return은 값을 반환하고 함수의 실행을 종료합니다.

제너레이터는 메모리 효율성을 높이고, 큰 데이터 처리를 쉽게 해주는 Python의 중요한 도구입니다. 큰 데이터 파일을 읽거나, 연속적인 계산을 처리할 때 매우 유용합니다.

반응형