[python] 파이썬에서 제너레이터와 이터레이터를 활용한 함수형 프로그래밍에 대해 알려주세요.

함수형 프로그래밍은 프로그램을 작성할 때, 순수 함수와 불변성을 강조하는 프로그래밍 패러다임입니다. 파이썬은 함수형 프로그래밍을 지원하는 다양한 기능들을 제공하고 있으며, 이 중 제너레이터와 이터레이터는 함수형 프로그래밍에 많이 활용되는 중요한 개념입니다.

제너레이터

제너레이터(generator)는 값을 생성해주는 함수입니다. 제너레이터는 일반적인 함수와 다르게 yield 문을 사용하여 값을 반환하고, 함수가 일시적으로 중단될 수 있는 구조를 가지고 있습니다. 이러한 특징을 통해 제너레이터는 매우 큰 크기의 데이터를 처리할 때 메모리를 효율적으로 관리할 수 있으며, 지연된 실행을 통해 효율적인 반복 처리를 수행할 수 있습니다.

제너레이터 함수는 함수의 정의와 유사하지만, 함수 내부에서 yield 문을 사용하여 값을 반환하고 상태를 유지할 수 있습니다. 예를 들어, range() 함수를 제너레이터로 구현해보겠습니다.

def generator_range(stop):
    num = 0
    while num < stop:
        yield num
        num += 1

for i in generator_range(5):
    print(i)

위의 예제 코드는 generator_range() 함수를 이용하여 0부터 4까지의 값을 생성하는 제너레이터를 만들었습니다. 이를 for 문을 사용하여 호출하면 제너레이터가 순차적으로 값을 반복적으로 생성하면서 출력됩니다.

이터레이터

이터레이터(iterator)는 값을 차례대로 반환해주는 객체입니다. 이터레이터는 __iter__() 메서드와 __next__() 메서드를 갖는 클래스로 구현할 수 있으며, __iter__() 메서드는 이터레이터 자신을 반환하고, __next__() 메서드는 다음 값을 반환합니다.

파이썬에서는 iter() 함수를 사용하여 이터레이터 객체를 생성할 수 있습니다. 이터레이터 객체는 next() 함수를 사용하여 값을 차례대로 받아올 수 있습니다.

my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)

print(next(my_iterator))
print(next(my_iterator))
print(next(my_iterator))

위의 예제 코드는 my_list 리스트를 이용하여 이터레이터 객체를 생성하고, next() 함수를 통해 값을 차례대로 출력하는 예시입니다.

제너레이터와 이터레이터의 활용

제너레이터와 이터레이터는 함께 사용될 때 매우 강력한 도구가 될 수 있습니다.

예를 들어, 텍스트 파일의 각 줄을 처리하는 경우를 생각해보겠습니다. 이때, 제너레이터를 이용하여 파일의 각 줄을 읽을 수 있는 구조를 생성하고, 이터레이터를 사용하여 한 줄씩 처리할 수 있습니다.

def read_file(filename):
    with open(filename, 'r') as file:
        for line in file:
            yield line.strip()

file_generator = read_file('data.txt')

for line in file_generator:
    # 각 줄을 처리하는 로직을 작성합니다.
    print(line)

위의 예제 코드는 read_file() 제너레이터 함수를 이용하여 파일로부터 한 줄씩 값을 읽어오는 구조를 생성하고, 이를 for 문을 사용하여 한 줄씩 처리하는 예시입니다.

이처럼 제너레이터와 이터레이터를 함께 사용하면 데이터를 효율적으로 처리하고, 반복 작업을 간단하게 수행할 수 있습니다.

마무리

파이썬에서 제너레이터와 이터레이터는 함수형 프로그래밍을 지원하면서 메모리 효율성과 반복 작업의 편의성을 제공하는 중요한 개념입니다. 이를 활용하여 데이터 처리와 반복 작업을 효율적으로 수행할 수 있으며, 함수형 프로그래밍의 장점을 활용하여 코드의 가독성과 유지보수성을 개선할 수 있습니다.

참고 문서: