[파이썬] 파이썬 2와 파이썬 3의 제너레이터 동작 차이

파이썬 프로그래밍에서, 제너레이터는 반복 가능한 객체를 생성하는 강력한 도구입니다. 파이썬 2와 파이썬 3에서 제너레이터 동작에 약간의 차이가 있기 때문에, 이번 글에서는 이 두 버전 사이의 주요 차이점을 다루고자 합니다.

1. 제너레이터의 선언

파이썬 2에서는 제너레이터를 선언하기 위해 yield 키워드를 사용합니다. 예를 들어, 아래의 코드는 1부터 10까지의 정수를 반환하는 제너레이터 함수를 보여줍니다.

def generator_example():
    for i in range(1, 11):
        yield i

반면에, 파이썬 3에서는 제너레이터를 선언하는 방법이 약간 변경되었습니다. yield from 문법을 사용하여 보다 간결하게 제너레이터를 작성할 수 있습니다. 아래의 코드는 같은 제너레이터 함수를 파이썬 3 문법으로 작성한 예제입니다.

def generator_example():
    yield from range(1, 11)

2. yield 표현식

파이썬 2에서는 yield 키워드 다음에 표현식을 작성하는 방식으로 값을 반환할 수 있습니다. 예를 들어, 아래의 코드는 1부터 10까지의 정수를 반환하며, 제너레이터가 실행될 때마다 yield 표현식을 통해 현재 값을 반환합니다.

def generator_example():
    for i in range(1, 11):
        yield i * 2 # 값에 2를 곱한 결과를 반환

반면에, 파이썬 3에서는 yield 표현식을 사용하여 값을 반환하는 것이 아닌, yield 키워드 뒤에 아무런 값도 작성하지 않습니다. 아래의 코드는 같은 제너레이터 함수를 파이썬 3 문법으로 작성한 예제입니다.

def generator_example():
    for i in range(1, 11):
        yield i * 2  # 제너레이터에서 값을 반환하지 않음

3. StopIteration 예외 처리

파이썬 2에서는 제너레이터에서 더 이상 반복할 요소가 없을 때, StopIteration 예외를 발생시켜야 합니다. 이를 위해 제너레이터 내에서 raise 키워드를 사용하여 StopIteration 예외를 직접 발생시켜야 합니다. 예를 들어, 아래의 코드는 제너레이터에서 더 이상 값을 반환하지 않을 때, StopIteration 예외를 발생시킵니다.

def generator_example():
    for i in range(1, 11):
        yield i * 2

    raise StopIteration  # 반복이 종료된 후 StopIteration 예외 발생

하지만 파이썬 3에서는 StopIteration 예외를 직접 처리하지 않아도 됩니다. 제너레이터에서 마지막에 yield 구문을 실행한 후, 자동으로 반복 종료되고 예외 처리가 필요하지 않습니다.

def generator_example():
    for i in range(1, 11):
        yield i * 2

위의 예제는 파이썬 3에서도 정상적으로 작동합니다.

결론

파이썬 2와 파이썬 3의 제너레이터 동작에는 몇 가지 차이점이 있습니다. 이러한 차이점은 제너레이터를 작성하고 사용하는 방법에 영향을 미칠 수 있으므로 유의해야 합니다. 파이썬 3 문법에 맞게 제너레이터를 사용하여 보다 간결하고 효율적인 코드를 작성할 수 있습니다.