본문 바로가기
programming/Python

파이썬 반복자 멈추기 StopIteration stopping python iterator

by 개코 - 개발과 코딩 2021. 11. 19.

반복을 함에 있어 조건은 필요하다. StopIteration 은 반복자를 이용해 반복을 실행할 경우 특정 조건을 만나면 반복을 멈추는 기능을 한다.  반복을 사용하는 경우 많다. 일괄처리를 위한 배치프로세스나 대량의 데이터를 조작과 가공을 위해서 사용한다. 반복은 편하지만 중간에 멈추고 다음 작업을 처리할 수 있도록 할 필요가 있다. 뭐 멈추지 않으면 여러가지 문제가 나타나긴 한다. 보통 메모리이기도 하다.

파이썬 클래스 반복자 멈추기
stopping python iterator 

반복자를 반복하여 데이터를 가공하고 조작하는 것은 좋지만 무한 루프에 빠질 가능성이 있다.

물론, for 반복문을 사용하면 그런 일은 없겠지만 특이한 경우 무한 루프에 빠져 곤혹을 겪을 수 있다.

보통 코드 작성시 오타나 변수의 설정을 잘못하여 일어나는 문제들이 더 많겠지만 말이다.

파이썬 클래스로 만든 반복자를 통해 반복을 중단할 수 있도록 하는 것은 프로그램의 동작을 제어하는 것에 용이하다.

사용법

반복자를 멈추게 하기 위해선 조건문을 추가하여 중단시키면 된다.

이 때 사용되는 키워드가 StopIteration 이다.

반복자가 지속적으로 반복을 하고 있을 때 특정 조건으로 무한루프를 막고 프로그램의 동작이 중단될 수 있도록 한다.

보통 반복문을 사용하는 경우 범위는 적지만 일괄처리를 위한 배치를 운영하는 경우는 얘기가 다르다.

class PythonCls : #-{
    
    def __iter__(self) : #-{
        return self
    #-}
    
    def __next__(self) : #-{
        
        if 조건 : #-{
        #-}
        else : #-{
            raise StopIteration
        #-}
    #-}
    
  #-}
  
#-}

샘플코드

위의 사용법을 가지고 코드를 만들어 본다.

비교를 위해 먼저 조건없이 무한루프에 걸리는 반복문을 먼저 작성할 것이다.

이후 결과를 확인하고 StropIteration 을 사용하여 반복자의 반복을 멈추도록 할 것이다.

먼저 조건문 없이 반복자를 실행시켜 반복을 시켜보자.

class PythonCls : #-{
    
    def __iter__(self) : #-{
        self.a = 0
        return self
    #-}
    
    def __next__(self) : #-{
        
        x = self.a
        self.a += 10
        return x
    #-}
    
  #-}
  
#-}

vCls = PythonCls()
vIter = iter(vCls)

for lpEach in vIter : #-{
    print(lpEach)
#-}

위의 코드는 중단없이 계속 진행된다.

결과화면을 보자.

순식간에 만단위까지 덧셈이 이루어졌다.

이제 위의 코드에서 조건을 추가하고 StopIteration 을 추가해 주도록 한다.

이후 반복자의 반복이 멈추는 것을 확인하도록 한다.

클래스 메서드이 next 에 조건을 주고 무한루프에 빠지지 않도록 StopIteration 을 추가하였다.

class PythonCls : #-{
    
    def __iter__(self) : #-{
        self.a = 0
        return self
    #-}
    
    def __next__(self) : #-{
        
        if ( self.a <= 10000) : #-{
            x = self.a
            self.a += 10
            return x
        #-}
        else : #-{
            raise StopIteration
        #-}
    #-}
#-}

vCls = PythonCls()
vIter = iter(vCls)

print("----------")

for lpEach in vIter : #-{
    print(lpEach)
#-}

print("----------")

결과화면을 보자.

조건에 부합한 후 반복이 멈춘것을 확인할 수 있다.

반응형

댓글