파이썬 생성기 클래스
이 자습서에서는 yield
문과 next()
함수를 사용하여 Python에서 생성기 클래스를 만드는 방법에 대해 설명합니다.
생성기를 이해하려면 먼저 아래에서 설명하는 반복자를 이해해야 합니다.
파이썬 반복자
반복자는 컨테이너의 요소에 하나씩 액세스하는 데 사용되는 개체입니다. for
문을 사용하여 컨테이너 개체를 반복하여 값을 개별적으로 가져올 수 있습니다.
아래에 예제 코드가 나와 있습니다.
for element in [5, 6, 7]:
print(element)
위의 Python 코드에서 요소 목록을 반복하고 하나씩 인쇄합니다. 무대 뒤에서 무슨 일이 일어나고 있는지 이해합시다.
for
문은 주어진 컨테이너 객체에서 iter()
함수를 호출하고 이 함수는 주어진 컨테이너 객체의 각 요소에 하나씩 액세스하는 __next__()
메서드를 포함합니다.
루프는 __next__()
함수가 StopIteration
예외를 발생시킬 때 종료되며 해당 예외는 지정된 컨테이너 객체 내에 더 이상 요소가 없을 때만 발생합니다.
Python은 또한 __next__()
함수를 호출하는 데 사용할 수 있는 내장 함수 next()
를 제공합니다. 컨테이너 객체에서 next()
함수를 사용하려면 iter()
함수를 사용하여 객체를 생성해야 합니다.
예를 들어 숫자 목록을 사용하고 next()
함수를 호출하여 목록의 각 요소를 하나씩 가져옵니다. 아래 코드 및 출력을 참조하십시오.
My_list = [5, 6, 7]
iter_object = iter(My_list)
print(next(iter_object))
print(next(iter_object))
print(next(iter_object))
print(next(iter_object))
출력:
5
6
7
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-10-aa02bcda701b> in <module>
4 print(next(iter_object))
5 print(next(iter_object))
----> 6 print(next(iter_object))
StopIteration:
위의 코드에서 next()
함수를 네 번 호출하여 주어진 목록 객체의 세 요소를 개별적으로 반환했습니다. 목록 개체에 더 이상 요소가 없기 때문에 네 번째로 호출했을 때 StopIteration
예외를 반환했습니다.
루프를 사용하여 next()
함수를 호출할 수도 있습니다.
try-except
문을 사용하면 오류를 방지하고 예외 이름을 사용하여 루프를 종료할 수 있습니다. 예를 들어 루프와 try-except
문을 사용하여 위의 코드를 반복해 보겠습니다.
아래 코드 및 출력을 참조하십시오.
My_list = [5, 6, 7]
iter_object = iter(My_list)
for i in range(len(My_list)):
try:
print(next(iter_object))
except StopIteration:
break
출력:
5
6
7
위의 코드에서 루프를 끊기 위해 예외 이름인 StopIteration
을 사용했습니다. 위의 반복자는 정방향 시퀀스에서 값을 하나씩 반환하지만 요구 사항에 따라 값을 반환하는 고유한 반복자를 정의할 수도 있습니다.
반복자 동작을 클래스에 추가하려면 __init__()
, __iter__()
및 __next__()
의 세 가지 함수를 정의해야 합니다. 예를 들어 피보나치 수를 반환하는 클래스를 만들어 봅시다.
아래 코드를 참조하십시오
class Fibexample:
def __init__(self):
self.x, self.y = 0, 1
def __iter__(self):
return self
def __next__(self):
r_value = self.x
self.x, self.y = self.y, self.x + self.y
return r_value
fib = Fibexample()
for i in range(7):
print(next(fib))
출력:
0
1
1
2
3
5
8
위의 클래스는 next()
함수가 호출될 때마다 피보나치 수열의 숫자를 반환합니다. 위의 코드에서 next()
함수를 7번 호출하여 피보나치 수열의 처음 7개 숫자를 반환했습니다.
파이썬 생성기 클래스
Python에서 제너레이터는 반복자를 만드는 데 사용됩니다. 일반 함수와 동일합니다. 유일한 차이점은 return
문 대신 yield
문을 사용하는 것입니다.
yield()
문은 반복자 객체를 반환하는 next()
함수를 호출합니다. 예를 들어 위의 코드와 동일한 피보나치 수열을 반환하는 제너레이터 함수를 만들어 봅시다.
아래 코드 및 출력을 참조하십시오.
def fibexample(data_input):
x, y = 0, 1
for index in range(data_input):
z = x
x, y = y, x + y
yield z
obj = fibexample(7)
for i in obj:
print(i)
출력:
0
1
1
2
3
5
8
위의 코드에서 fibexample()
함수는 반복자 개체에서 필요한 피보나치 수열의 수를 반환합니다. 루프를 사용하여 개체를 반복하여 반복자 개체에 있는 각 값을 가져올 수 있습니다.
생성기는 데이터 값과 next()
함수의 마지막 실행을 기억하고 next()
함수가 다시 호출될 때 중단된 위치에서 다시 시작합니다.
위 함수의 결과는 iterators 예제에서 얻은 것과 같지만, 위의 코드는 iterators 예제에서 사용한 코드에 비해 상대적으로 짧습니다. 생성기 사용의 이점은 __iter__()
및 __next__()
함수가 자동으로 생성되고 생성기가 StopIteration
예외도 처리한다는 것입니다.
제너레이터를 사용하여 이터레이터를 생성하는 것은 yield
문을 사용하여 간단한 함수를 작성하는 것과 같기 때문에 제너레이터를 사용하여 이터레이터를 작성하는 것은 쉽습니다.