티스토리 뷰

📌  이터레이터와 제너레이터

이터레이터란 여러 개의 요소를 가지는 컬렉션에서 요소를 하나씩 꺼내 어떠한 명령을 수행하도록 돕는 객체를 의미한다.  제너레이터는 일반 함수와 같이 정의되며, 데이터를 반환할 때에 return문이 아닌 yeild문을 사용한다. return과 달리 yeild문을 사용하면 데이터가 보존된다. 

 


👉  이터레이터

✔  이터레이터는 반복자라는 의미로, 순회 가능한 자료구조의 요소를 탐색하는데 도움을 준다.

✔  말하자면 시퀀스의 여러 요소를 하나씩 꺼내어 어떤 수행을 하는데 도움을 주는 객체라고 볼 수 있다.

#이터레이터 객체 생성
iterator = range(3).__iter__()

# __next__를 사용해 다음 데이터에 접근
print(iterator.__next__())
print(iterator.__next__())
print(iterator.__next__())

✔  이터레이터는 __iter__메서드와 __next__ 메서드로 구현되어있다.

✔  이터레이터는 반복의 기능은 없으므로, 반복문을 사용해 처리하는 것이 효율적이다.

#LIST Iterator
for i in [1,2,3] :
	print(i)
    
#RANGE Iterator    
for i in range(3) :
	print(i)
    
#STRING Iterator    
for i in '123' :
	print(i)   

✔  이터레이터는 반복의 기능은 없으므로, 반복문을 사용해 처리한다.

  for문은 먼저 주어진 객체의 __iter__ 메서드를 호출한다.

  __iter__ 메서드는 하나의 요소를 반환하고 __next__ 메서드를 사용해 다음 요소를 가리킨다.

  더 이상 가져올 데이터가 없으면 Stoplteration 예외를 발생시키고 반복을 종료한다.

✔  range함수를 약식으로 이터레이터를 활용해 만들어보자.

 

class MyRange :
    def __init__(self, start, end) :
        self.current = start
        self.end = end

✔  MyRange 클래스를 정의할 때에, 생성자의 매개변수로 start지점과 end지점을 전달받도록 한다.

✔  전달받은 값으로 인스턴스 변수를 생성한다.

    def __iter__(self) :
        return self

✔  객체를 호출했을 때 실행되는 특수 메서드 __iter__를 구현한다.

    def __next__(self) :
        if self.current < self.end :
            current = self.current
            self.current+=1
            return current
        else :
            raise StopIteration()

✔  for문이 반복할 때마다 다음 index의 요소를 가리키게 도와주는 특수 메서드 __next__를 구현한다.

✔  start 지점과 end 지점을 벗어나지 말아야 하므로 조건문을 사용한다.

✔  범위를 벗어나는 경우는 Stopiteration() 예외를 발생시켜 종료한다.

for i in MyRange(0,10) :
    print(i,end=' ')

✔ 객체를 생성하고 for문을 사용해 출력한다.

class MyRange :
    def __init__(self, start, end) :
        self.current = start
        self.end = end
    
    def __iter__(self) :
        return self
    
    def __next__(self) :
        if self.current < self.end :
            current = self.current
            self.current+=1
            return current
        else :
            raise StopIteration()

for i in MyRange(0,10) :
    print(i,end=' ')

✔  전체 코드와 실행 결과는 위와 같다.

 

👉 제너레이터

✔  제너레이터는 데이터를 반환할 때에 return문이 아닌 yeild문을 사용한다.

 return과 달리 yeild문을 사용하면 데이터가 보존된다.

✔  range함수를 약식으로 제너레이터를 활용해 만들어보자.

def MyRange(start, end):
    current = start
    while current < end:
        yield current
        current += 1
    return
 
for i in MyRange(0, 5):
    print(i)

✔  제너레이터는 함수와 동일한 구조로 정의한다. 다만 데이터 반환할 때 yeild문을 사용한다는 차이가 있다.

current = start #0

while문
current<end   yield 	current++
    0<5		0	    1
    1<5		1	    2
    2<5		2    	    3
    3<5		3	    4
    4<5		4	    5
    5<5 	-	    -

return #프로그램 종료

✔  yeild문은 return을 만나기 전까지 데이터를 반환한다. 실행 순서는 위와 같다.

 

 

 

 

 

[참고] 엘리스 트랙-혼자 공부하는 파이썬 / 길벗-파이썬 코딩 도장 / 엘리스 트랙 - 예제 중심의 파이썬 입문 / 위키백과

댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday