python - 생성기를 기반으로 파이썬 반복기를 작성하는 가장 좋은 방법은 무엇입니까

출처 python iterator generator

생성기를 기반으로하는 Python 반복기를 작성하는 좋은 방법을 찾고 있습니다. 반복자 주제에 대한 많은 자습서와 생성기와 yield 문에 대한 많은 자습서를 찾았지만 둘을 결합하는 것은 없습니다. 나는 작동하는 작은 예제를 만들었고 더 나은 방법이 있는지 궁금했습니다.

class myIterator :

    def __init__(self, n) :
        self.last = n
        self.myGen = self.myGenerator() 

    def __iter__(self) :
        return self.myGenerator()

    def next(self) :
        return self.myGen.next()

    def myGenerator(self) :
        prev = 0
        fib = 1
        while fib < self.last :
            res = fib
            yield res
            fib = fib + prev
            prev = res

        raise StopIteration


SQLStatements.py in my Github repository에서 찾을 수있는 실제 프로그램에서이 기술을 사용했습니다.

이것의 가장 당혹스러운 부분은 next () 함수를 정의하는 것이 었습니다. 명백한 솔루션은 모두 호출 될 때마다 첫 번째 요소를 반환했습니다. 생성기를 포함하는 인스턴스 변수를 저장하는 것은 작동하지만 엉망인 것 같습니다.

이 작업을 수행하는 더 좋은 방법이나이 주제를 다루는 좋은 자습서를 알고 있으면 알려주십시오.

편집하다:
@MartijnPieters가 게시 한 세 번째 예제는 문제를 완전히 해결합니다. self.generator.next 함수를 self.next에 저장하면 다음 함수가 제공됩니다. 이 문제를 해결하려는 다른 사람에게 도움이되기를 바랍니다.
반복기 프로토콜은 두 부분으로 구성됩니다. __iter__ 메서드는 가장 중요한 메서드이며 객체에 iter()를 사용할 때 반복자를 반환 할 것으로 예상됩니다.

__iter__의 본문을 myGenerator로 바꾸십시오. StopIteration를 올릴 필요가 없습니다.

class myIterator:
    def __init__(self, n):
        self.last = n

    def __iter__(self):
        prev = 0
        fib = 1
        while fib < self.last:
            res = fib
            yield res
            fib += prev
            prev = res


이제 iter(myIterator(10))는 반복자이며 .next() 메소드를 가지고 있습니다.

클래스를 반복자로 직접 유용하게하려면 __iter__를 반환하고 self 메서드를 제공하는 .next()가 필요합니다.

.next() 메서드는 함수 본문 당 하나의 요소를 생성합니다 (그리고 return somevalue 사용). 생성기는 yield를 사용하는 함수일뿐입니다. 실제로 이러한 메서드 자체가 반복기 프로토콜 (.next() 포함)을 구현합니다.

.next()를 사용하는 경우 다음과 같이 표시됩니다.

class myIterator:
    def __init__(self, n):
        self.last = n
        self.prev = 0
        self.fib = 1

    def __iter__(self):
        return self

    def next(self):
        if self.fib < self.last:
            res = self.fib
            self.fib += self.prev
            self.prev = res
            return res

        raise StopIteration


또는 생성기의 .next() 메소드를 재사용 할 수 있습니다.

class myIterator:
    def __init__(self, n):
        self.last = n
        self.next = self.myGenerator().next  # Use the generator `.next`

    def __iter__(self):
        return self

    def myGenerator(self):
        prev = 0
        fib = 1
        while fib < self.last:
            res = fib
            yield res
            fib += prev
            prev = res
관련 기사

python - 스레딩이있는 python tkinter로 인해 충돌

python - Python 속성을 사용한 특성 매핑

python - TypeError : 'str'개체를 호출 할 수 없습니다.

python - 문자열을 인용 된 요소가있는 공백으로 구분 된 목록으로 변환

python - 데비안에서 파이썬 스크립트 데몬 화

python - 사전 인 self 형식 지정

python - 서로 상대적인 Python 필터 목록 항목

python - 비 루트 사용자로서의 감독자 [닫힘]

python - REST API의 일반 (HTML이 아닌) 오류 페이지

python - 지정된 바이트 오프셋에서 파일에서 행 가져 오기