Python 이터레이터

Python 이터레이터

이터레이터는 값을 가진 갯수를 포함하는 객체입니다.

이터레이터는 이터레이블 객체입니다. 이를 통해 모든 값을 순회할 수 있습니다.

기술적으로 Python에서는, 이터레이터 프로토콜을 구현하는 객체가 이터레이터입니다. 이터레이터는 다음 메서드를 포함합니다 __iter__()__next__()

이터레이터 VS 이터레이블 객체(Iterable)

리스트, 튜플, 딕셔너리, 셋은 모두 이터레이블 객체입니다. 이터레이블 컨테이너로서 사용할 수 있으며, 이터레이터(Iterator)를 얻을 수 있습니다.

모든 이러한 객체는 이터레이터를 얻기 위해 iter() 메서드:

예제

원소를 반환하는 이터레이터를 출력합니다:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))

실행 예제

자바스크립트에서도 문자열이 이터레이블 객체입니다. 이터레이터를 반환할 수 있습니다:

예제

문자열도 이터레이블 객체입니다. 문자열의 일련의 문자를 포함하고 있습니다:

mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

실행 예제

이터레이터 순회

for 루프를 사용하여 이터레이블 객체를 순회할 수도 있습니다:

예제

원소를 이터레이션합니다:

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

실행 예제

예제

문자열 내의 문자를 이터레이션합니다:

mystr = "banana"
for x in mystr:
  print(x)

실행 예제

ヒント:for 루프는 실제로 이터레이터 객체를 생성하고, 각 루프 실행에 next() 메서드가 있습니다.

이터레이터 생성

객체/클래스를 이터레이터로 생성하려면, 객체에 __iter__()__next__() 메서드가 있습니다.

Python 클래스/객체 장자에서 배웠듯이, 모든 클래스는 __init__() 객체를 생성할 때 초기화를 수행할 수 있는 함수입니다.

__iter__() 메서드의 역할은 유사하지만, 작업(초기화 등)을 수행할 수 있으며 항상 이터레이터 객체 자체를 반드시 반환해야 합니다.

__next__() 메서드도 작업을 수행할 수 있으며, 시퀀스의 다음 항목을 반드시 반환해야 합니다.

예제

숫자를 반환하는 이터레이터를 생성하려면, 1부터 시작하여 각 시퀀스가 1씩 증가하는(1, 2, 3, 4, 5 등을 반환) 다음과 같이 합니다:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
  def __next__(self):
    x = self.a
    self.a += 1
    return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

실행 예제

StopIteration

충분한 next() 또는 for 루프에서 사용할 수 있습니다. 위의 예제는 영원히 진행될 것입니다.

반복이 영원히 진행되지 않도록 방지하기 위해, 문장을 사용할 수 있습니다. StopIteration 문장.

에서 __next__() 메서드에서, 반복이 지정된 횟수를 완료하면 중지 조건을 추가하여 오류를 발생시킬 수 있습니다:

예제

20번의 반복 후 중지됩니다:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
  print(x)

실행 예제