Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

행복한 개구리

Python 공부내용 21.10.09. Python - Iterators(반복자) 본문

Python/공부내용

Python 공부내용 21.10.09. Python - Iterators(반복자)

HappyFrog 2021. 10. 9. 17:37

W3Schools의 Python Tutorial을 보며 해석하고 정리한 글입니다.

오역이 존재할 수 있습니다

저도 파이썬은 처음이니 가볍게 봐주세요 :D 

W3Schools


파이썬 Iterators(반복자)

iterator(반복자)는 유한한 수의 값을 담는 객체입니다.

 

iterator는 반복할 수 있는 객체입니다. 즉 당신은 모든 값에 접근 수 있습니다.

 

기술적인 측면에서, 파이썬에서 반복자는  __iter__()  __next__()  메서드로 구성된 반복자 프로토콜을 실행하는 객체입니다.

 

Iterator vs Iterable (반복자 vs 반복가능)

리스트, 튜플, 딕셔너리, 세트는 반복 가능한 객체입니다. 이것들은 반복자 형식으로 받을 수 있는 반복 가능한 수용체입니다.

 

이 모든 객체들은 반복자에서 가져올 수 있는  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))

▲ 결괏값

 

Iterator를 통해 반복하기

우리는 또한  for  반복문을 통해 반복 가능한 객체를 반복할 수 있습니다.

mytuple = ("apple", "banana", "cherry")

for x in mytuple:
	print(x)

▲ 결괏값

 

mystr = "banana"

for x in mystr:
	print(x)

▲ 결괏값

 for  반복문은 사실 매 회 반복할 때마다 반복자 객체를 만들고 next() 메서드를 실행시킵니다.

 

반복자 생성하기

객체/클래스로써의 반복자를 생성하려면 당신의 객체에  __iter__()  __next__()  메서드를 구현해야 합니다.

 

당신이 파이썬 클래스/객체 챕터에서 배웠듯이 모든 클래스는 객체를 생성할 때 초기화해주는  __init__()  함수를 호출합니다.

 

 __iter__()  메서드는  __init__()  과 비슷하게 작동합니다. 당신은 작업(초기화 등)을 수행할 수 있지만 반드시 항상 반복자 객체 그 자체를 반환해야 합니다.

 

 __next__()  메서드는 당신이 작업을 수행할 수 있게 해줍니다. 그리고 반드시 다음 순서의 아이템을 반환해야 합니다.

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))

▲ 결괏값

 

반복 멈추기

위 예시는 next() 선언만 충분히 해주거나  for  반복문을 사용했다며 평생이라도 지속될 것입니다.

 

반복자가 평생 지속되는 것을 방지하기 위해서 우리는  StopIteration  문을 사용합니다.

 

 __next__()  메서드에서 우리는 만약 반복자가 일정 횟수만큼 실행되었다면 에러를 발생시키는 종료 조건을 추가할 수 있습니다.

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
    
    def __next__(self):
        if self.a <= 5:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
    print(x)

▲ 결괏값 // StopIteration을 사용할 땐 raise를 사용하여 발생시킨다.