Book/파이썬 코딩의 기술

[BW 33] yield from을 사용해 여러 제너레이터를 합성하라

31514 2024. 11. 8. 10:52

다음은 제너레이터를 사용해 화면의 이미지를 움직이게 하는 그래픽 프로그램 예제이다.

처음에는 이미지가 빠르게 이동하고, 잠시 멈춘 다음, 다시 이미지가 느리게 이동한다.

def move(period, speed):
    for _ in range(period):
        yield speed

def pause(delay):
    for _ in range(delay):
        yield 0

def animate():
    for delta in move(4, 5.0):
        yield delta
    for delta in pause(3):
        yield delta
    for delta in move(2, 3.0):
        yield delta

def render(delta):
    print(f"Delta: {delta:.1f}")

def run(func):
    for delta in func():
        render(delta)

run(animate)

>>>
Delta: 5.0
Delta: 5.0
Delta: 5.0
Delta: 5.0
Delta: 0.0
Delta: 0.0
Delta: 0.0
Delta: 3.0
Delta: 3.0

이 코드의 문제점은 animate가 너무 반복적이라는 것이다.

 

yield from 식을 사용하면 이 문제를 해결할 수 있다.

def animate():
    yield from move(4, 5.0)
    yield from pause(3)
    yield from move(2, 3.0)

yield from은 근본적으로 파이썬 인터프리터가 우리 대신 for 루프를 내포시키고 yield 식을 처리하도록 만든다.

이로 인해 성능 또한 좋아진다.