오답노트
[Python] iterator / yield 본문
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 |