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)