패스트캠퍼스 한 번에 끝내는 파이썬 웹 개발 초격차 패키지 pt2 - 이터레이터

정영찬·2022년 2월 11일
0

이터러블 객체 (iterable object)

  • 순서가 있는 자료형
  • 문자열, 리스트, 튜플, 딕셔너리, range객체

이터레이터 생성 방법

  • 이터레이터 클래스를 정의해준다.
  • __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)
  • 이터레이터 클래스를 정의해준다. - Seasons 클래스 생성(리스트와 인덱스를 가리키는 숫자, 리스트 길이의 정보를 담고 있는 파라미터를 선언)
  • __iter__ 메서드를 정의해준다. 객체 자기 자신을 return
  • __next__ 메서드를 정의해준다. 리스트의 데이터값을 하나 하나씩 반복적으로 리턴을 시키고 리스트 데이터를 모두 리턴한뒤에 호출되면 오류를 발생시킨다.

결과 화면

profile
개발자 꿈나무

0개의 댓글