티스토리 뷰

728x90
반응형

"Python Cookbook"을 공부하여 개인적으로 유용하게 쓸 내용을 기록했습니다.

 

파이썬에서 순환하는 방식


iterator 객체란 값을 차례대로 꺼낼 수 있는 객체로, iterable한 객체(list, dict, set, str, bytes, tuple 등)를 파이썬 내장함수 iter()를 이용해서 만들 수 있다. 

이 iterator의 특징은 next() 내장함수를 통해 요소들을 순환하며 접근할 수 있다는 것입니다.

for문의 경우 내부적으로 iterable한 객체를 iter()를 통해 iterator로 만들고 next()로 순환합니다.

다음 요소가 없는 경우 StopIteration 예외를 발생시킵니다.

※ 파이썬 언더스코어(_)에 대하여 아래 포스팅을 참고했습니다.

https://mingrammer.com/underscore-in-python/

 

파이썬 언더스코어(_)에 대하여

파이썬에서 언더스코어(underscore, _)는 특별하다. 타 언어에서 언더스코어(_)는 단지 스네이크 표기법의 변수나 함수명을 위해서만 사용되어지

mingrammer.com

 

사용자 컨테이너에서 사용 가능한 iterator 만들기


class Node:
    def __init__(self, value):
        self._value = value
        self._children = []

    def __repr__(self):
        return 'Node({!r})'.format(self._value)

    def add_child(self, node):
        self._children.append(node)

    def __iter__(self):
        return iter(self._children)

if __name__ == '__main__':
    root = Node(0)
    child1 = Node(1)
    child2 = Node(2)
    root.add_child(child1)
    root.add_child(child2)
    for ch in root:
        print(ch)

# 출력
# Node(1)
# Node(2)

위의 Node 클래스는 순환 가능한 사용자 정의 컨테이너 입니다. 이 컨테이너에 사용 가능한 iterator를 만들기 위해 

__iter__()라는 매직메소드를 사용합니다. 이 매직메소드는 순환 요청을 받을 때 실행되는 메소드로 iter() 함수를 이용해 iterator 객체를 반환하도록 구현합니다.

iter() 함수는 인자로 들어온 iterable한 객체의 __iter__ 함수를 호출해 iterator를 반환합니다.

위의 경우에서는 root가 for 문에 의해 __iter__() 메소드가 호출되고, 이 메소드에서 iter(self._children) 코드에 의해 self._children의 __iter__() 메소드가 호출됩니다. self._children는 iterable한 list 객체이므로 list 객체를 iterator로 만들어 반환할 것입니다.


제너레이터 동작 방식


 yield라는 키워드를 이용하면 원하는 값을 리턴하면서 반복을 종료하지 않고 이어나갈 수 있어 제너레이터를 만들 수 있다.

c = countdonw(3)에 의해 제너레이터가 생성되지만 아무런 출력이 없다. c를 확인해 보면 generator object인 것이 보인다.

이는 위의 이터레이터와 비슷하게 생성을 한 뒤, next()를 통해 값을 만들어야 한다. 여기서 중요한 점은 다음이라는 연산에 응답할 때만 값을 만들어 낸다는 것이다.

마찬가지로 순환을 종료하면 StopIteration 예외를 발생시킨다.

이러한 제너레이터의 특징들을 우리는 대부분 for문을 이용해 처리하기 때문에 신경쓰지 않는다.

제너레이터 frange()를 for문을 이용해 값을 생성하고 출력해줬다.

또는 순환 객체를 소비하는 list()같은 함수를 이용해도 제너레이터가 순환을 종료할 때 까지 값을 만들어낸다.

 


 

728x90
반응형

'python' 카테고리의 다른 글

python 태그와 임의 값 나누기, deque  (0) 2019.06.26
python 가장 빈도 수 높은 문자 출력  (0) 2019.06.25
python product, list 붙이기  (0) 2019.06.24
python lambda, reduce  (0) 2019.06.24
python *(Asterisk) 이용 , iterable  (0) 2019.06.24
댓글