Kim Jinung
Python - container, iterable, iterator, generator 본문
파이썬의 리스트, 딕셔너리, 스트링 같이 원소를 가지는 데이터 구조를 컨테이너라고 부른다.
그리고 컨테이너는 이터레이블하며 이는 반복이 가능한, 순회가 가능한 자료구조라는 의미다.
그리고 이터레이블한 객체는 이터레이터라는 인스턴스를 생성할 수 있다.
num_list = [1, 2, 3]
for num in num_list:
print(num)
num_list는 리스트라는 컨테이너다. 따라서 이터레이블하다.
for 문에서는 이터레이블한 num_list를 순회하고자 한다. 이때 num_list를 그대로 사용하는 것이 아니라
num_list를 활용해서 이터레이터 인스턴스를 생성한다.
이터레이터는 값 생성기로 다음 값을 요청하면 반환하고 그 다음 값을 반환하게 된다.
위 for 문에서 num 변수는 처음 1을 반환한다. 그리고 이터레이터는 다음 값인 2를 반환할 준비를 한다.
num_list = [1, 2, 3, 4, 5]
num_iterator = iter(num_list)
print(num_iterator)
print(next(num_iterator))
print(next(num_iterator))
print(next(num_iterator))
print(next(num_iterator))
print(next(num_iterator))
print(next(num_iterator))
iter 함수를 이용해서 num_list라는 리스트의 이터레이터(인스턴스)를 생성했다.
num_iterator를 출력하면 리스트 이터레이터와 메모리 주소가 출력된다.
다음으로 next함수를 이용해서 이터레이터를 탐색하면 이터레이터는 순서대로 값을 반환하고 다음에 반환해야할 값을 기억한다.
그런데 위 코드에서 배열의 요소는 5개인데 6번을 출력했다.
6번째 출력에서는 스탑 이터레이션 에러를 뱉으며 종료된다.
즉 for문은 스탑 이터레이션을 만나면 탐색을 끝낸다.
마지막으로 제너레이터는 우아한 이터레이터다.
- 모든 제너레이터는 이터레이터다.
- 모든 제너레이터는 게으른 팩토리다.
def fib():
prev, curr = 0, 1
while True:
yield curr
prev, curr = curr, prev + curr
f = fib()
print(f)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
첫 번째 호출 시 prev, curr = 0, 1 라인이 실행되고 while 문으로 들어가고, yield 문을 만나 curr 변수에 저장한 값을 생성한다. 그리고 유휴 상태로 돌아간다.
두 번째 호출시 유휴 상태에서 벗어나 prev, curr = curr, prev + curr 라인이 실행된 후, 다시 while 루프를 타고 yield curr 라인이 실행되고 유휴 상태로 진입한다.
즉 제너레이터는 이터레이터 인스턴스를 한 번에 모두 생성하지 않고 요청이 올때만 작업을 수행한다. 이는 메모리 및 CPU 자원을 필요할 때만 사용하는 이점이 있다.
'Language > Python' 카테고리의 다른 글
Python - Counter (0) | 2022.12.06 |
---|---|
Python - for/else (0) | 2022.12.02 |
Python - Regular Expression (0) | 2022.11.30 |
Python - GIL(Global Interpreter Lock) (0) | 2022.11.23 |
Python "Class method" vs "Static method" vs "Instance method" (0) | 2022.11.16 |