Generator란?
- iterator를 생성해주는 함수, 함수안에 yield 사용
- lazy evaluation으로 계산결과 값이 필요할때까지 계산을 늦춘다
- 무한한 순서가 있는 객체를 모델링 가능
iterator vs generator
- iterator는 데이터에 순차적으로 접근이 가능하지만 호출해야하는 모든 데이터를 미리 메모리에 적재해야한다.
- 반면 generator는 호출할 때마다 다음에 나올 데이터를 계산해서 반환한다. 메모리 효율이 좋다.
- 예를 들어 100억번까지 호출이 필요한 iterator를 만드려면 메모리에 100억개의 데이터를 저장해야하지만, generator는 100억까지를 순차적으로 계산할 수 있는 로직만 있으면 된다.
# iterator
a = iter([1,2,3,4])
next(a) #출력: 1
next(a) #출력: 2
next(a) #출력: 3
next(a) #출력: 4
# generator
def infinite_generator():
count = 0
while True:
count+=1
yield count
gen = infinite_generator()
next(gen) #출력: 1
next(gen) #출력: 2
next(gen) #출력: 3
next(gen) #출력: 4
yield
- yield는 return과 다르게 함수를 완전히 종료시키지 않는다.
- generator 함수가 실행중 yield를 만날경우, 해당 함수는 그 상태로 정지되며 반환값을 전달한다.
- 함수가 종료되는 것이 아니기때문에 함수는 그상태로 유지되고 함수에서 사용된 local변수는 메모리에 그대로 유지가 되어서 일시정지와 시작을 하는 맥락으로 계속해서 계산을 수행하고 generator에서 필요한 값을 반환받을 수 있다.
'Python' 카테고리의 다른 글
[Python] json 데이터 다루기 (1) | 2021.10.16 |
---|---|
[Python] iterable과 iterator (0) | 2021.10.15 |
[Python] 파이썬 가상환경(venv) 설정하기 (0) | 2021.06.18 |