카테고리 없음

제너레이터

1space 2024. 7. 26. 16:57

오늘은 제너레이터에 대해 살펴보겠습니다. 그전에 이터러블과 이터레이터에 대해 설명하겠습니다.

 

이터러블과 이터레이터

프로그래밍을 하다 보면 "이터러블(Iterable)"과 "이터레이터(Iterator)"라는 용어를 자주 접하게 됩니다. 특히 파이썬과 같은 고수준 언어에서는 이 개념들이 매우 중요합니다. 이번 글에서는 이 두 가지 개념에 대해 상세히 설명해보겠습니다.

 

이터러블이란 반복할수 있는 객체를 말합니다. 쉽게 말해, 한 요소씩 순차적으로 접근할 수 있는 객체를 말합니다. for 루프와 함께 사용될 수 있으며 파이썬에서 이터러블 객체에는 리스트, 튜플, 문자열, 딕셔너리 등이 있습니다. 

 

이터레이터는 이터러블 객체를 순회하는 객체입니다. 이터러블을 만들고 싶다면 이터레이터를 만들면 됩니다. 이터레이터를 만드는 방법으로는 제너레이터를 사용할 수 있습니다. 제너레이터는 표현식과 함수로 표현 할 수 있습니다. 각각 하나씩 알아보겠습니다.

 

 

제너레이터 표현식

 

전에 리스트 컴프리헨션에 대해 알아보았습니다. 제너레이터 표현식 역시 똑같습니다. 리스트 컴프리헨션의 [ ] 괄호를 ( ) 괄호로 바꾸기만 하면 됩니다.

 

generator = (i * i for i in range(1, 100 + 1))

 

이렇게 1 부터 100까지 숫자를 제곱하는 제너레이터 표현식을 만들어 보았습니다.

 

 

print(generator)

 

이렇게 출력을 하면 제너레이터 객체 출력됩니다.

 

이터레이터를 만들기 위해 제너레이터가 사용이 되는데 이터레이터는 next( ) 함수의 매개변수로 넣어서 내부의 요소를 하나씩 꺼낼 수 있습니다. 

print(next(generator))
print(next(generator))
print(next(generator))
print(next(generator))
print(next(generator))

 

이렇게 next( ) 함수를 활용할 때마다 하나씩 출력되는 것을 볼 수 있습니다.

 

 

제너레이터 함수

 

제너레이터 함수는 yield 키워드를 사용하는데 return 키워드와 마찬가지로 뒤에 값을 지정합니다. 

 

def gen_function():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
    
generator = gen_function()
print(generator)

 

제너레이터 함수역시 호출했을때 제너레이터를 만듭니다. 따라서 next( ) 함수를 사용하게 되면 yield 키워드 뒤의 값을 출력하게 됩니다.

 

print(next(generator))
print(next(generator))
print(next(generator))
print(next(generator))
print(next(generator))

 

그럼 아까 제너레이터 표현식으로 만들었던 코드를 제너레이터 함수로 구현해보도록 하겠습니다.

 

def gen_function():
    for i in range(1, 100 + 1):
        yield i * i

generator = gen_function()
print(next(generator))
print(next(generator))
print(next(generator))
print(next(generator))

 

이렇게 4번 출력했을때 각각 제곱한 값이 나오는 것을 볼 수 있습니다. 전에 설명했던 map( ) 함수와 filter( )함수 모두 제너레이터 함수입니다.