파이썬 생성기 클래스

Ammar Ali 2023년6월21일
  1. 파이썬 반복자
  2. 파이썬 생성기 클래스
파이썬 생성기 클래스

이 자습서에서는 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 문을 사용하여 간단한 함수를 작성하는 것과 같기 때문에 제너레이터를 사용하여 이터레이터를 작성하는 것은 쉽습니다.

작가: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

관련 문장 - Python Class