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__()