Python에서 Iterator와 Generator 구별하기
Jesse John
2023년1월30일
반복자와 생성기는 출력을 생성하거나 일부 코드를 한 번에 한 비트씩 반복적으로 처리하는 데 도움이 됩니다. 이 기사에서는 간단한 예제를 통해 Python의 반복자와 생성기 간의 몇 가지 기본적인 차이점을 배웁니다.
파이썬의 반복자
Iterator의 기본 기능은 다음과 같습니다.
- 반복자는 반복자 프로토콜을 구현하는 클래스를 사용하여 생성된 객체입니다. 이는 클래스에
__iter__
및__next__
메서드가 정의되어 있음을 의미합니다. __next__
메서드는return
문을 사용하여 값을 반환합니다.return
문은 해당 메서드의 마지막 라인이어야 하므로return
문 전에__next__
의 다음 실행에서 사용할 변수를 업데이트해야 합니다.
가장 간단한 경우, __iter__
는 self
를 반환합니다.
파이썬의 생성기
발전기의 기본 기능은 다음과 같습니다.
- 발전기는 함수입니다.
- 생성기 함수는
return
키워드 대신yield
키워드를 사용합니다.
2.1yield
키워드는 값을 산출하고 함수의 실행을 일시 중단합니다.
2.2next()
에 대한 다음 호출은yield
문 다음의 코드 실행을 재개합니다.
생성기 함수를 사용하면 클래스를 사용하여 반복기를 만들 때 필요한 모든 추가 코드 없이 생성기 반복기를 만들 수 있습니다.
Python의 Iterator 및 Generator 예제
다음 두 가지 예는 이전 두 섹션에서 언급한 요점을 강조합니다. 두 예 모두 1부터 시작하는 정수의 제곱을 생성하는 방법을 보여줍니다.
첫 번째 예는 반복자를 사용하여 수행하는 방법을 보여줍니다. 두 번째 예는 생성기를 사용하는 동등한 코드를 보여줍니다.
Iterator에 대한 예제 코드:
# ITERATOR (Class)
class squares(object):
def __init__(self, num1):
self.nxt_sq_of = 1
self.lim = num1
def __iter__(self):
return self
def __next__(self):
if self.nxt_sq_of <= self.lim:
ret_sq_of = self.nxt_sq_of
self.nxt_sq_of += 1
return ret_sq_of * ret_sq_of
else:
raise StopIteration
# Iterator Object
a = squares(6)
# Next value of the iterator.
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
# Using the iterator in a loop.
a1 = squares(6)
while True:
print(next(a1))
출력:
next(a)
Out[3]: 1
next(a)
Out[4]: 4
next(a)
Out[5]: 9
next(a)
Out[6]: 16
next(a)
Out[7]: 25
next(a)
Out[8]: 36
next(a)
Traceback (most recent call last):
File "<ipython-input-9-15841f3f11d4>", line 1, in <module>
next(a)
File "<ipython-input-1-9dbe8e565876>", line 17, in __next__
raise StopIteration
StopIteration
생성기에 대한 예제 코드:
# GENERATOR FUNCTION
def gen_squares(num2):
i = 1
while i <= num2:
yield i * i
i += 1
# Generator iterator.
b = gen_squares(5)
# Next yield of the generator iterator.
next(b)
next(b)
next(b)
next(b)
next(b)
next(b)
출력:
next(b)
Out[3]: 1
next(b)
Out[4]: 4
next(b)
Out[5]: 9
next(b)
Out[6]: 16
next(b)
Out[7]: 25
next(b)
Traceback (most recent call last):
File "<ipython-input-8-adb3e17b0219>", line 1, in <module>
next(b)
StopIteration
결론
우리는 파이썬의 생성기를 사용하여 생성기 반복자를 생성하는 간결한 코드를 작성할 수 있다는 것을 알게 되었습니다.
반면에 Iterator는 프로그래머가 __iter__
메서드에 대한 사용자 정의 코드를 작성할 수 있도록 해주기 때문에 훨씬 더 강력합니다.
자세한 내용은 다음을 참조하십시오.
- generators를 위한 Python Wiki 기사.
- iterators를 위한 Python Wiki 기사.
작가: Jesse John