Programming Language/Python

[Python] 제너레이터(Generator)

LeeJaeJun 2024. 6. 14. 11:31
728x90
반응형

제너레이터(Generator)

  • 이터레이터(Iterator)를 간단히 생성해주는 함수
  • 일반적인 함수처럼 정의되지만, 값을 반환할 때 return 대신 yield 사용
  • 제너레이터 함수는 호출될 때 실행되지 않고, 제너레이터 객체를 반환
  • 이터레이터 프로토콜를 따름
  • yield 키워드: 값을 생성하고, 함수의 실행 상태를 유지. 다음 next() 호출 시 이 상태로 다시 실행을 시작
  • 지연 평가: 값을 필요할 때마다 하나씩 생성하여 메모리 사용을 줄임
def gen():
	yield 'a'
    yield 'b'
    yield 'c'
    
g = gen()
next(g) # 'a'
next(g) # 'b'
next(g) # 'c'
next(g) # StopIteration
  • 모든 제너레이터는 이러에티러를 만드므로 제너레이터 객체는 이터레이터 객체임

 

제너레이터 표현식

  • 제너레이터 함수를 사용하지 않고 간단하게 제너레이터를 만드는 방법
  • 소괄호 '()'를 사용하여 정의
gen_exp = (x * x for x in range(3))

print(next(gen_exp))  # 0
print(next(gen_exp))  # 1
print(next(gen_exp))  # 4
print(next(gen_exp))  # StopIteration

 

제너레이터와 제너레이터 표현식의 차이

  • 제너레이터 함수: 함수 내에서 yield 키워드를 사용하여 제너레이터 객체를 생성. 함수가 호출될 때마다 제너레이터 객체를 반환.

 

  • 제너레이터 표현식: 소괄호 ()를 사용하여 간단히 제너레이터를 생성. 표현식 자체가 제너레이터 객체를 반환.

다음은 같은 기능을 하는 제너레이터 객체를 각각 제너레이터 함수와 제너레이터 표현식으로 나타낸 코드이다.

# 제너레이터 함수 사용
def mygen():
    for i in range(1, 1000):
        result = i * i
        yield result

 

# 제너레이터 표현식 사용
gen = (i * i for i in range(1, 1000))

 

728x90
반응형