본문 바로가기

Programming/Python

[Python] 이터레이터, 제너레이터 개념

반응형
  • 컨테이너
  • 이터레이블
  • 이터레이터
  • 제너레이터
  • 제너레이터 표현식
  • list, set, dict 컴프리헨션

개념 소개

1. 컨테이너

: 원소들을 가지고 있는 데이터 구조이며, 멤버쉽 테스트를 지원

: 메모리에 상주하는 데이터 구조로, 보통 모든 원소 값을 메모리에 가지고 있다. 파이썬에서 잘 알려진 컨테이너는 다음과 같다.

  • list, deque
  • set
  • dict, defaultdict, OrderedDict, Counter
  • tuple, namedtuple,
  • str

어떤 객체가 특정한 원소를 포함하는지 안하는지를 판단할 수 있으면 컨테이너

 

2. 이터레이블

: 대부분의 컨테이너는 Iterable(반복 가능한)이다. 그러나 더 많은 것들 또한 이터레이블이다. 일례로 파일 열기, 소켓 열기 등이다. 컨테이너가 일반적으로 유한할 경우, 이터레이블은 무한한 데이터 소스를 나타낼 수도 있다.

>>> x = [1, 2, 3]
>>> print(x)
[1, 2, 3]
>>> y = iter(x)
>>> z = iter(x)
>>> next(y)
1
>>> next(z)
1
>>> next(z)
2
>>> type(x)
<class 'list'>
>>> type(z)
<class 'list_iterator'>

⇒ y, z는 이터레이블 x로부터 값을 생성해내는 이터레이터의 객체이고 x는 이터레이블(반복 가능한)이다. y와 z는 상태를 가진다.

 

3. 이터레이터

그럼 Iterator란 무엇일까? 이는 **next()**를 호출할 때 다음 값을 생성해내는 상태를 가진 Helper 객체이다.

**next()**를 가진 모든 객체는 이터레이터이다.

즉 이터레이터는 값 생성기이다. 다음 값을 요청할 때마다 내부 상태를 유지하고 있기 때문에 다음값을 계산하는 방법을 알고 있다.

>>> from itertools import count
>>> counter = count(start=13)
>>> next(counter)
13
>>> next(counter)
14
>>> from itertools import cycle
>>>
>>> colors = cycle(["red", "white", "blue"])
>>>
>>> next(colors)
'red'
>>> next(colors)
'white'
>>> next(colors)
'blue'
>>> next(colors)
'red'
>>> next(colors)
'white'

4. 제너레이터

generator : iterator를 생성해주는 함수, 함수 안에 yield 키워드를 사용

 

특징

  1. iterable한 순서 지정
  2. 느슨하게 평가
  3. 함수의 내부 로컬 변수를 통해 내부 상태 유지
  4. 무한한 순서가 있는 개체를 모델링할 수 있다. (명확한 끝이 없는 데이터 스트림)
  5. 자연스러운 스트림 처리를 위 파이프라인으루 구성할 수 있다.

장점

⇒ 아주 작은 메모리로 대용량의 반복 가능한 구조를 순회할 수 있다는 것

Ref

https://mingrammer.com/translation-iterators-vs-generators/

반응형