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
이렇게 만든 화면상 변위를 단일 animation 제너레이터에서 만들어진 것처럼 화면에 표시한다.
def render(delta):
print(f'Delta: {delta:.1f}')# :.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
# 다음 코드는 animation 함수를 yield from을 사용해 다시 작성,
#2번을 통합
def animate_composed():
yield from move(4, 5.0)
yield from pause(3)
yield from move(2, 3.0)
run(animate_composed)
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
import timeit
def child():
for i in range(1_000_000):
yield i
def slow():
for i in child():
yield i
def fast():
yield from child()
baseline = timeit.timeit(
stmt='for _ in slow(): pass',
globals=globals(),
number=50)
print(f'수동 내포: {baseline:.2f}s')
comparison = timeit.timeit(
stmt='for _ in fast(): pass',
globals=globals(),
number=50)
print(f'합성 사용: {comparison:.2f}s')
수동 내포: 6.88s
합성 사용: 6.16s