본문 바로가기

python

iterator (이터레이터)와 iterable (이터러블)

1. iterator

1) 기본

1> 정의: 값을 차례대로 꺼낼 수 있는 객체

2) 방식

1> 방식: iterator만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식

(미리 값을 만들어두고 가져다 쓰는 방식은 아니다.)

2> 그래서 data 생성을 뒤로 미룹니다. (lazy evaluation라고도 합니다.)

 

2. iterable (반복 가능한 객체)

1) 기본

1> 예시: string, 리스트, 딕셔너리, range, set, frozenset, 

- collection container는 모두 iterable

- 대부분의 container는 다 iterable하다고 생각해도 됩니다.

2> 정의 1: 요소가 여러 개 들어있고, 한 번에 하나씩 꺼낼 수 있는 객체

3> 정의 2: iterable이 될 수 있다. 

- iterable는 iter라는 함수로 iterator가 될 수 있어야 한다.

 

cf> PEP 8에서 소개하는 언더스코어 사용 4가지 경우의 수

https://codechacha.com/ko/pythonic-and-pep8/

 

2) iterable인지 확인하는 법

1> dir 함수를 통해 해당 객체 내부에 __iter__메서드가 들어있는지

dir(iterable인지 검증하고자하는 객체)

=> __iter__ 가 나오면 iterable

 

3. iterable을 iterator로 만들어서 요소를 하나씩 꺼내는 방법

중요: iterable ->(iter)-> iterator ->(next)-> 요소 뽑아내기

1) 방법 1

1> iterable 생성

my_iterable = [1,2,3]

2> iter 함수를 이용해서 iterable을 iterator로 만든다.

my_iterator = iter(my_iterable)

3> next 함수를 이용해서 요소를 하나씩 꺼낸다.

next(my_iterator)

마치 pop 함수와 유사해서 next 함수를 사용할 때마다 내부 요소를 출력후 제거합니다.

그래서 iterator 내부의 모든 요소를 다 꺼내면 'StopIteration' error가 납니다.

 

2) 방법 2

1> iterable 생성

my_iterable = [1,2,3]

2> __iter__() 함수를 이용해서 iterable을 iterator로 만든다.

my_iterator = my_iterable.__iter__()

3> __next__() 함수를 이용해서 요소를 하나씩 꺼낸다.

my_iterator.__next__()