본문으로 바로가기

제네리이터는 생성기라고 부릅니다. 생성기가 무엇인지 알아보기 전에 비교되는 개념인 이더레이터에 대해 먼저 알아보겠습니다.

 

이더레이터(Iterator)

>>> a = [1,2,3,4,5]
>>> a
[12345]
 
>>> b = iter(a)
>>> b
<list_iterator at 0x56371d0>
 
>>> import six
>>> six.next(b)
1
>>> six.next(b)
2
>>> six.next(b)
3
>>> six.next(b)
4
>>> six.next(b)
5
>>> six.next(b)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-19-f7e00bba024e> in <module>()
----> 1 six.next(b)
 
StopIteration: 
cs

 

1 ~ 5의 리스트 a를 생성하고, b에 iter()라는 함수를 사용하여 인자로 a를 줍니다.

그리고 b를 출력해 보니 결과는 <list_iterator at 0x56371d0> 이렇게 나옵니다. 이것은 리스트 이더레이터 객체가 표시된 메모리 주소에 위치한다는 의미인데 파이썬에서 이더레이터를 생성하는 과정입니다.

 

이더레이터를 생성하고 six.next() 함수를 사용하여 출력되는 값들을 살펴보면 순차적으로 출력되는것을 확인할 수 있는데, 이것이 바로 이더레이션 입니다.

 

이더레이터(Iterator) : 명시된 b

이더레이션(Iteration) : 이더레이터 b로부터 순차적으로 요소를 가져오는 행위

이더레이블(Iterable) : 이더레이션이 가능하다..

 

여기서 이더레이블 하다는것은 이더레이터뿐 아니라 순차적으로 요소를 가져올수 있는것 즉, 이더레이션이 가능한것은 이더레이블 하다고 할 수 있습니다. 리스트 a는 이더레이터는 아니지만 for문을 이용해 순차적으로 요소를 가져올 수 있기때문에 이더레이션이 가능하고 이더레이블 하다고 말할 수 있습니다.

 

제네레이터(Generator)

제네레이터는 이더레이터와 결과는 유사하지만 그 과정에서 많은 차이가 납니다.

>>> def num_generator(n):
    print("Function Start")
    while n < 6:
        yield n
        n += 1
    print("Function End")
 
>>> for i in num_generator(0):
    print(i)
 
Function Start
0
1
2
3
4
5
Function End
 
cs

num_generater(n)이라는 생성기 함수를 만들고 for문을 이용해 결과를 출력해봅니다.

 

함수를 시작할때 'Function Start'를 출력하고 while문을 돌리고 함수를 종료한다는 'Function End'라는 문구를 출력합니다.

while문은 n의 값이 6보다 작은동안 반복이 되고, while문 내에는 "yield n"이라는 명령이 있고 n의 값을 1씩 증가시킵니다.

그리고 for문을 이용해 출력을 합니다. 생성기는 일반적으로 fot문과 짝을 이루어 사용되는데 for문을 보면 num_generator(0)에서 요소를 하나씩 추출해 i 라는 공간에 저장하고 해당 공간의 값을 출력 하도록 합니다. 그런데 num_generator()라는 생성기는 반환하는 값이 없습니다.

무슨 요소를 가지고 있다고 for문을 이용하여 요소를 추출할까요?

 

결과를 살펴보면 "Function Start" 문자열이 가장 먼저 출력되고 이후 숫자 0부터 5까지가 출력된 후 "Function End" 문자열이 출력됩니다.

yield는 생성기의 핵심입니다. yield를 사용하는 함수는 곧 생성기가 되는것 입니다. 일반적인 return 합수는 함수가 종료시에 값을 반환하지만 yield는 일반적인 함수에서의 return의 역할을 하고 해당 함수는 종료되지 않습니다.

즉, yield를 이용해 값을 반환하더라도 현재의 상태를 유지하고 있다고 생각하면 됩니다.

 

생성기의 특징은 첫번째로 값을 반환하여도 종료되지 않고 상태를 계속 유지한다는 것입니다. 따라서 for문에 의해 다시 호출될 때 유지하고 있던 상태로부터 흐름을 이어갑니다. 두번째는 이미 데이터가 저장되어 있는 상태에서 요소를 하나씩 추출해내는 이더레이터와 달리 생성기는 필요한 시점에 값을 생성하고 추출해낸다는 것입니다.

 

생성기는 파일 스트림, 데이터 흐름에 기반한 프로그램을 작성할 때 아주 유용합니다. 텍스트 파일로부터 한 라인씩 읽어와 그 안에 특정 텍스트를 찾는 등의 동작을 하는 프로그램 등 많은 예의 프로그램에서 핵심기능으로 사용할 수 있습니다.

 

 

 

'Data Science > Python' 카테고리의 다른 글

파이썬 입문  (0) 2016.05.03
DataFrame Merage  (0) 2016.01.28
제네레이터(Generator) 와 이더레이터(Iterator)  (0) 2016.01.22
파이썬 패키지 다운로드  (0) 2016.01.19
numpy 내장함수  (0) 2016.01.12
[Python] 클래스  (0) 2015.03.11

댓글을 달아 주세요