본문 바로가기

코딩/파이썬 기초

파이썬 튜토리얼 043. Iterators와 Generators에 대한 예제

Iterators

문자열, 리스트, 튜플 및 딕셔너리 등은 container object로 분류된다.

 

for 문에서 container object의 iter() 메서드가 호출된다.

iter() 메서드는 __next__() 메서드를 포함하는 iterator object를 반환한다.

__next__() 메서드는 정의된 요소를 하나씩 반환하며, 더 이상 반환할 요소가 없는 경우 StopIteration 예외를 발생시킨다.

 

<코드 1>

hello = 'hello'
print(type(hello))

hello_iter = iter(hello)
print(type(hello_iter))

print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))

 

<코드 1>은 파이썬 내장 함수 iter()와 next()를 사용한 예이다.

 

 

여섯번째 next(hello_iter) 호출 시 더 이상 반환할 값을 갖고 있지 않아 StopInteration 예외가 발생한다

 

 

<코드 2>

hello = 'hello'
hello_iter = iter(hello)

for e in hello_iter:
    print(e)

 

<코드 1>에서 반복적으로 next() 함수를 호출하는 대신 for 문을 사용해 hello_iter의 요소를 하나씩 출력한다.

 

 

<코드 3>

class HelloClass:
    def __init__(self):
        self.hello = 'hello'
        self.len = len(self.hello)
        self.index = -1

    def __iter__(self):
        return self

    def __next__(self):
        self.index += 1
        if self.index >= self.len:
            raise StopIteration
        else:
            return self.hello[self.index]

myhello = HelloClass()

for e in myhello:
    print(e)

 

<코드 1>에서 iter() 함수로 생성한 hello_iter와 동일한 결과를 갖는 클래스 HelloClass를 작성해 본다.

 

Generators

Generators는 Iterators를 생성하는 간단한 도구라는 설명이 있는데 코드로 확인해 본다.

 

<코드 4>

def char_to_number(data):
    for c in data:
        yield int(c) * 10

for n in char_to_number('12345'):
    print(type(n), n)

 

<코드 4>에서 char_to_number() 함수 내 yield 키워드로 반환하고자 하는 데이터를 지정한다.

for 문은 char_to_number() 함수가 종료될 때까지 yield 키워드에 의해 반환된 값을 사용하게 된다.

 

 

<코드 5>

def char_to_number():
    yield 100
    yield 200
    yield 300

for n in char_to_number():
    print(type(n), n)

 

<코드 5>를 통해 char_to_number() 함수가 실행되는 동안 3개의 yield 문이 하나씩 실행되고, for 문의 n 값도 100, 200, 300으로 변함을 확인할 수 있다.

 

 

<코드 6>

numbers = (i for i in range(1, 10, 2))
print(type(numbers))

print(sum(numbers))

 

<코드 6>은 리스트 컴프리헨션과 유사하게 괄호를 이용해 Generator를 만드는 예를 보여준다.

 

 

참고로 내장 함수 sum()의 파라미터 정의는 다음과 같다.

 

sum(iterable, /, start=0)