본문 바로가기
프로그래밍/Python

파이썬 문법 6 - 이터레이터(Iterator) 와 제너레이터(Generator)

by pentode 2018. 4. 8.

이글은 파이썬 튜토리얼의 Iterator를 정리한 것 입니다.(https://docs.python.org/3/tutorial/classes.html#iterators)

 

1. 이터레이터(Iterator)

 

파이썬에서 반복자는 여러개의 요소를 가지는 컨테이너(리스트, 튜플, 셋, 사전, 문자열)에서 각 요소를 하나씩 꺼내 어떤 처리를 수행하는 간편한 방법을 제공하는 객체 입니다.

 

>>> for element in [1,2,3]:
        print(element)

>>> for element in (1,2,3):
        print(element)

>>> for element in {1,2,3}:
        print(element)

>>> for key in {"a":1,"b":2,"c":3}:
        print(key)

>>> for char in "123":
        print(char)

>>> for line in oepn("myfile.txt")
        print(line)

 

이터레이터와 제네레이터

 

사전(dict) 인 경우 key 값만 나오는데, key에 해당하는 값도 같이 가져오려면 아래와 같이 하면 됩니다.

 

for key, value in {"a":1,"b":2,"c":3}.items():
	print(key, value)

 

for문은 먼저 주어진 컨테이너 객체에 대해 iter() 메소드를 호출해서 이터레이터 객체를 구합니다. 그리고 나서 내부의 요소를 하나씩 가져오기 위해서 __next__()를 호출합니다. 이 메소드는 하나의 요소를 반환하고 다음 요소 를 가리킵니다. 더이상 가져올게 없으면 StopIteration 예외를 발생시킵니다. 이터레이터에 대해서 다음 요소를 직접 가져오기 위해서는 내장 함수인 next() 를 사용할 수 있습니다.

 

>>> s = 'abc'
>>> it = iter(s)
>>> it
    <str_iterator object at 0x000001B6297FB760>
>>> next(it)
    'a'
>>> next(it)
    'b'
>>> next(it)
    'c'
>>> next(it)
    Traceback (most recent call last):
        File "<pyshell#6>", line 1, in
            next(it)
    StopIteration

 

 

2. 제너레이터(Generator)

 

제너레이터(Generator)는 이터레이터(Iterator)를 만드는 간단하고 강력한 도구 입니다. 제너레이터는 일반적인 함수처럼 작성되지만 데이터를 반환하기 위해서 return 문장이 아니라 yield 문장을 사용합니다. 매번 next() 메서드가 호출될 때마다 제너레이터는 중단된 지점부터 다시 시작합니다.(모든 데이터 값과 마지막 실행된 명령문을 기억합니다.) 즉, return 을 사용하는 함수라면, 반환될 때마다 내부 지역변수들은 사라지지만 yield를 사용할 경우 내부 값들이 보존됩니다.

 

>>> def reverse(data):
        for index in range(len(data)-1, -1, -1):
            yield data[index]

>>> for char in reverse('golf'):
        print(char)
    f
    l
    o
    g
>>>

 

 

3. 제너레이터(Generator) 표현식

 

제너레이터는 list comprehension과 유사한 문법을 사용해서 간결하게 코딩되어 질 수 있습니다. 대괄호 대신 괄호를 사용합니다. 이 제너레이터 표현식은 함수의 인자로 즉시 사용되는 상황을 위해 디자인 되었습니다.

 

제곱의 합을 구합니다.

 

>>> sum(i*i for i in range(10)) 285

 

위의 표현식에서의 출력 내용을 확인해 볼 수 있습니다.

 

>>> for val in (i*i for i in range(3)):
        print(val)
    0
    1
    4
>>>

 

※ 참고

 

다중 할당 (Multiple Assignment):

파이썬은 동시에 여러 변수에 하나의 값을 할당 할 수 있습니다.다.

 

a = b = c = 1

 

여러 변수에 여러 개체를 할당 할 수 있습니다.

 

a, b, c = 1, 2, "홍길동"

 

 

List Comprehension :

입력 Sequence로부터 지정된 표현식(조건)에 따라 새로운 리스트를 만듭니다.

 

[출력표현식 for 요소 in 입력Sequence [if 조건식]]

 

>>> [x for x in [1,2,3,4,5] if x % 2 == 0]

       [2, 4]

반응형