파이썬 생성기 클래스

Ammar Ali 2023년6월21일 Python Python Class
  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 문을 사용하여 간단한 함수를 작성하는 것과 같기 때문에 제너레이터를 사용하여 이터레이터를 작성하는 것은 쉽습니다.

튜토리얼이 마음에 드시나요? DelftStack을 구독하세요 YouTube에서 저희가 더 많은 고품질 비디오 가이드를 제작할 수 있도록 지원해주세요. 구독하다
작가: 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