__iter__
메서드를 정의해준다.__next__
메서드를 정의해준다.우리가 흔히 사용하는 for 반복문을 한번 구현해보자
for i in [10,20, 30]:
print(i)
위의 반복문이 10, 20, 30 을 출력한다는 사실을 알고있다.
하지만 어떤 원리로 되는걸까?
[10,20,30]
리스트의 디렉토리를 살펴보기위해 print(dir([10,20,30]))
코드를 실행해보면
위의 내용이 출력되는데 여기서 __iter__
를 살펴보자.
해당 요소의 type을 살펴보기 위해 print(type([10,20,30].__iter__))
를 실행하면 class 'method-wrapper'
라는 결과가 나오는데, 이는 해당 요소가 클래스의 메서드 라는 것이고, 자세히 말하면 이터레이터 객체를 만들어주는 메서드이다.
만약 이 메서드를 호출하는 변수를 선언하고 실행을 해보면
iter_obj = [10,20,30].__iter__()
print(iter_obj) // <list_iterator object at 0x0000012A548A13A0>
리스트가 출력되는데 이를 for 문으로 다시 작성해서 실행하면
for i in iter_obj:
print(i) // 10 20 30
리스트에 있는 데이터들이 출력되는 모습을 볼 수 있다.
그렇다면 iter_obj
, 바꿔말하면 [10,20,30].__iter__()
내부를 한번 살펴보면
위와 같이 나타나고, 이중에서 __next__
를 사용해보면,
print(iter_obj.__next__()) // 10
[10,20,30]의 요소값을 출력하는데 여기서 하나를 더 추가해서 출력하면
print(iter_obj.__next__())
print(iter_obj.__next__()) // 10 20
여기서 하나 더 하면 리스트 값 전체가 출력되지만 만약에 한번 더 실행하면?
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
위와 같이 StopIteration 이라는 오류가 나타난다.
__init__
메서드가 실행되는데 이때 해당 메서드 내부에 __next__
메서드가 실행되어 리스트 내부의 요소값을 하나씩 출력하고, 전부 출력을 마치고 난뒤에 호출이 될경우 StopIteration이라는 오류를 내보낸다.# 이터레이터 생성방법
class Seasons:
def __init__(self):
self.season_list = ['spring','summer','autumn','winter']
self.idx = 0
self.max_num = 4
def __iter__(self):
return self
def __next__(self):
if self.idx < self.max_num:
curr_idx = self.idx
self.idx += 1
return self.season_list[curr_idx]
else:
raise StopIteration
for i in Seasons():
print(i)
__iter__
메서드를 정의해준다. 객체 자기 자신을 return__next__
메서드를 정의해준다. 리스트의 데이터값을 하나 하나씩 반복적으로 리턴을 시키고 리스트 데이터를 모두 리턴한뒤에 호출되면 오류를 발생시킨다.결과 화면