[python] 제너레이터와 이터레이터를 활용하여 파이썬에서 지연 평가를 구현할 수 있나요?

지연 평가(Lazy Evaluation)는 프로그램에서 필요한 값이 실제로 필요한 시점에 계산되는 것을 의미합니다. 이를 통해 불필요한 계산을 피하고, 메모리 사용을 줄일 수 있습니다. 파이썬에서 지연 평가를 구현하는 방법 중 하나는 제너레이터와 이터레이터의 개념을 활용하는 것입니다.

제너레이터(Generator)는 이터레이터(Iterator)를 생성하는 함수로, 이터레이터와 마찬가지로 값을 차례대로 반환합니다. 그러나 제너레이터는 값을 모두 한 번에 생성하는 것이 아니라, 필요한 값만 생성하여 메모리를 절약할 수 있습니다. 제너레이터 함수는 yield 키워드를 사용하여 값을 반환하며, 호출될 때마다 다음 값을 생성합니다.

이터레이터(Iterator)는 __iter__()__next__() 메서드를 구현한 객체로, 값을 차례대로 반환하는 역할을 합니다. 이터레이터를 만들기 위해서는 클래스 내에서 __iter__()__next__() 메서드를 정의해야 합니다.

다음은 제너레이터와 이터레이터를 활용하여 지연 평가를 구현하는 예제 코드입니다.

class FibonacciGenerator:
    def __init__(self, n):
        self.n = n
        self.current = 0
        self.previous = 1
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current >= self.n:
            raise StopIteration
        result = self.current
        self.current, self.previous = self.previous, self.current + self.previous
        return result

fibonacci = FibonacciGenerator(10)

for num in fibonacci:
    print(num)

위 코드는 피보나치 수열을 생성하는 제너레이터 클래스 FibonacciGenerator를 정의하고, 이터레이터로 사용하는 예제입니다. __next__() 메서드에서는 현재 값 self.current를 반환하고, 다음 값을 계산합니다. __iter__() 메서드는 객체 자체를 반환하여 이터레이터로 사용할 수 있도록 합니다.

FibonacciGenerator 클래스의 인스턴스를 생성한 후, for 문을 통해 순회하면서 피보나치 수열을 지연 평가하며 출력합니다. 이러한 방식으로 필요한 값만 생성하여 지연 평가를 구현할 수 있습니다.

지연 평가를 사용하면 큰 데이터셋을 다룰 때 효율적으로 메모리를 관리할 수 있습니다. 또한, 함수형 프로그래밍에서도 지연 평가를 활용하여 복잡한 연산을 조합하고, 중간 결과를 계산하지 않고 필요한 시점에만 연산을 수행할 수 있습니다.

더 자세한 내용은 아래 참고 자료를 참고해주세요.