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 식을 처리하도록 만든다.
이로 인해 성능 또한 좋아진다.