이터레이터와 반복 가능한 객체, 제너레이터 와 yield
반복 가능한 객체 란?
반복이 가능한 객체란 쉽게말해 하나씩 값을 꺼내 올 수 있는 객체를 의미한다.
즉 컬렉션 데이터 타입과 같이 값이 여러개여야 가능하다는 뜻이다.
이들은 for루프를 사용하여 하나씩 불러 올 수 있으며,
내부적으로는 __iter__() 메서드를 통해 반환을 할 수 있다.
#반복 가능한 객체 생성
repeatlist = [1,2,3,4,5]
#값을 하나씩 프린트
for num in repeatlist:
print(num)
이터레이터란?
이터레이터는 반복 가능한 객체의 요소를 하나씩 거내오는 객체이다.
즉 for 루프를 대신하여서 값을 꺼내오는 객체라고 생각하면 된다.
이터레이터를 사용하여서 객체의 요소를 꺼내오는 방법은 다음과 같다.
(내장함수이다)
numbers = [1,2,3,4,5]
iterator = iter(numbers)
print(next(iterator))
>> 1
프린트를 반복하게 되면, += 마냥 하나씩 표시된다.
__iter__()
이 메서드를 사용하여서 객체 자신을 반환을 시킨다.
__ next__()
이 메서드를 사용하여서 다음 요소를 반환한다.
만약 반환을 할 요소가 없다면, StopIteration 예외를 발생시킨다.
즉 __iter__()과 __next__()를 구현 해보면 아래의 모습이 된다.
Class Iteratortest :
def __init__(self, list)
self.list = list
self.num = 0
def __iter__(self):
return self
def __next_(self_:
if self.num < len(self.list) :
result = self.list[self.num]
self.num += 1
return result
else :
raise StopIteration
my_list = Iteratortest([1,2,3,4,5])
for num in my_list:
print(num)
__iter__()와 __next__()를 사용을 하여서 어떻게
for num un my_list가 돌아가게 되는지 설명을 해주는 것이다.
둘은 메서드로 굳이 쓰지 않아도 실행이 되기 때문이다.
제너레이터와 yield
제너레이터는 이터레이터를 생성하는 특별한 함수로, yield키워드를 사용해 값을 하나씩 반환 한다는데
솔찍히 무슨 이야기인지 잘 몰라서 알아보았다.
우선 제너레이터는 기본적으로 이런 형태를 띈다.
def simple_generator():
yield 1
yield 2
yield 3
yield 뒤의 값을 호출하고 일시 정지를 하게 되는 매커니즘이다.
즉 반복문을 생성하고 일드에 값을 넣으면 그 값이 도출이 되었을 때, 멈춘다는 의미다.
하지만 이는 호출 하는것과는 차이가 있다.
호출을 하는 방법에는 3가지로 예시를 들 수 잇다.
우선 함수로 하나씩 호출하기 이다.
print(next(simple_generator))
>> 1
for 루프를 사용하여 호출하기.
for value in simple_generator() :
print(value)
이렇게 반복문을 사용 한다면, 1 부터 10 까지 다 나오게 되는데 이는 yield가 중지 시켜도,
반복문으로 반복을 시키기 떄문이다.
list()로 한번에 호출하기
values = list(simple_generator())
print(values)
나는 이 제너레이터와 for문의 관계에 대해서 매우 고민을 많이 했다.
제너레이터는 yield를 사용하여 정지 시킴으로써
추가적인 계산을 하지 않게 하고,
for문은 값이 도출이 되어도 뒤에서는 돌아가며, 호출을 시키기 위해서
모든 값을 먼제 저장후 호출을 하는것이다.
즉 적은 단위의 값에서는 문제가 없을 지 몰라도, 데이터의 양이 커지면,
속도가 느려지기 마련이다.
'용어정리 > Python' 카테고리의 다른 글
python 용어정리 (프레임워크와 라이브러리) (0) | 2024.10.10 |
---|---|
python 용어정리 (데코레이터 와 컨텍스트 매니저) (6) | 2024.10.08 |
python 용어정리 (파일 다루기) (0) | 2024.10.08 |
python 용어정리 (메서드 친구들) (1) | 2024.10.07 |
python 용어정리 (클래스와 친구들) (0) | 2024.10.07 |