이터레이터는 값을 순차적으로 꺼내올 수 있는 객체 입니다.
만약 연속된 숫자를 미리 만들면 숫자가 적을 때는 상관없지만 숫자가 아주 많을 때는 메모리를 많이 사용하게 되므로 성능에 불리.
그래서 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용. 즉, 데이터 생성을 뒤로 미루는 것인데 이런 방식을 지연 평가(lazy evaluation)라고 함.
L이라는 리스트가 Iterable한지 알아보려면 dir(L) 함수로 알아볼 수 있다.
['add', 'class', 'contains', 'delattr', 'delitem', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'getitem', 'gt', 'hash', 'iadd', 'imul', 'init', 'init_subclass', 'iter', 'le', 'len', 'lt', 'mul', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'reversed', 'rmul', 'setattr', 'setitem', 'sizeof', 'str', 'subclasshook', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
iter가 존재하므로 iterable하기 때문에, iterator 객체라고 할 수 있다.
L = [1, 2, 3]
for x in L:
print(x ** 2, end=' ')
iterator를 사용하려면 iterator 객체를 통해 사용해야 한다.
위의 리스트 L을 iterator 객체로 등록하고 사용한다.
L_iterator = L.__iter__()
print(L.iterator__next__()) # 1
print(L.iterator__next__()) # 2
print(L.iterator__next__()) # 3
파이썬에서는 좀 더 직관적으로 이터레이터를 사용할 수 있게 iter(), next()함수를 제공한다.
I = iter(L)
while True:
try:
X = next(I)
except StopIteration:
break
print(X)
D = {'a':1, 'b':2, 'c':3}
for key in D.keys():
print(key)
while True:
try :
N = next(DI)
except StopIteration:
break;
print(N)