오답노트

[Python] iterator / yield 본문

Python

[Python] iterator / yield

권멋져 2022. 8. 6. 23:08

iterator

반복가능한 객체다 iter()를 통해 iterator를 만들 수 있다.

 

it = iter([1,2,3])

type(it) # list_iterator

next(it) # 1
next(it) # 2
next(it) # 3
next(it) # 에러발생

next 함수를 통해 itreator의 메모리 위치를 다음으로 바꿀 수 있다.

it 에는 1,2,3이 있는데 next를 4번 호출하게 되면, it 밖에 메모리를 보게돼서 에러가 발생한다.

 

class It:
    def __init__(self):
        self.prev = 0
        self.curr = 1
    def __iter__(self):
        return self
    def __next__(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value
        
        
it = It()
tpye(it) # __main__.It

next(it) # 0 1 1 2 3 5 8 ...

 

위 코드는 iterator를 통해서 피보나치 수열을 출력하는 함수다.

__iter__ 는 iter()와 매칭되고

__next__는 next()와 매칭된다.

 

즉 클래스를 생성할 때 iterator를 생성하고, next 함수로 클래스 객체를 인자로 받으면 __next__가 호출된다.

 

yield

generator로 함수에서 return과 비슷한 역할을 한다.

간단히 설명하면 함수는 return으로 함수가 끝나지만, yield는 값을 반환한 후에도 다시 호출하면 이전의 내용들을 이어서 연산 후에 반환한다.

 

def yld():
    prev,curr = 0,1
    while True:
        yield curr
        prev,curr = curr , prev + curr
        
y = yld()
type(y) # generator

next(y) # 1 1 2 3 5 8..

 

위 코드 또한 피보나치 수열을 함수로 만든 것이다. 하지만 타입을 보면 generator임을 알 수 있다.

next함수를 계속 호출하면 y는 값을 계속 내놓는다.

그냥 함수 였다면 계속 1이 나와야 하지만 genetator이기 때문에 이전 값을 기억해 연산 한 값이 출력된다.

 

def gen():
    yield 1
    yield 2
    yield 3
    
g = gen()

type(g) # generator

next(g) # 1
next(g) # 2
next(g) # 3
next(g) # 에러 발생

gen 함수는 yield로 1,2,3을 반환할 수 있다.

next 함수로 gen(g)를 인자로 받으면 yield 로 반환할 수 있는 1,2,3 이후에는 에러가 발생한다.

 

메모리 위치를 가지고 있다는 뜻이다.

 

 

iterator 와 yield 를 통해서 유동적인 프로그래밍을 할 수 있도록 노력해보자.

'Python' 카테고리의 다른 글

[핀테크] OpenDartReader  (0) 2023.05.02
[Colab] 런타임 중지 방지  (0) 2022.10.23
[Python3] JSON 패키지  (0) 2022.07.06
[Python3] 파일 읽기/쓰기  (0) 2022.07.06
[Python3] 문자열  (0) 2022.07.05