고급 파이썬 개발 과정
챕터
>
레벨
제너레이터
제너레이터 생성
때때로 여러분은 일회성 출력이 아니라 지속적으로 값을 생성하고 싶을 수 있습니다. 함수가 작동하는 방식과 유사하게, 제너레이터는 return() 대신 yield()를 사용하여 출력을 생성할 때 작성되고 실행되는 방식이 같습니다.
이 연습에서는 마굿간의 탱크에서 병에 우유를 채워야 합니다. 병을 채우고 모든 잉여 우유가 탱크에서 수집되도록 제너레이터를 사용하십시오.

목표
발전기를 사용하여 우유 탱크에서 우유를 펌핑하여 병에 채우세요.
소의 우유를 저장하는 기계가 거의 가득 찼습니다. 우유가 상하기 전에 병에 채워 보관해야 합니다. 일반적인 방법을 사용하면 이 작업이 다소 까다로울 수 있으며 추출할 수 있는 우유의 양이 약간 다를 수 있습니다. 다행히 발전기를 사용하여 이 과정을 원활하고 간단하게 만들 수 있습니다.
두 (2) 개의 우유 탱크가 있으며, 각 탱크에서 우유를 펌핑하고 병에 채워야 합니다. 각 기계에는 우유를 저장하는 구획이 있으며, 이는 tank_a 와 tank_b 라는 리스트 상수로 나타납니다. 게다가, 각 탱크에는 수집할 수 있는 잉여량이 남는 경향이 있습니다.
발전기는 함수와 같은 구문을 따르지만 출력을 위해 return 대신 yield 를 사용합니다. fill() 이라는 발전기를 설정하고 매개 변수로 list 를 지정하세요. 이는 앞 단락에서 언급한 상수를 입력할 위치입니다.
def fill(list):
for x in range(3):
yield list[x]
yield 5
생성기는 기계의 구획으로 표시된 리스트 상수의 세 (3) 개 필드에서 데이터를 읽고, 끝에 잉여량인 다섯 (5)을 추가합니다.
필드에서 바구니 객체를 수집하여 채우기에 필요한 병에 접근하고 두 (2) 개의 X 표시로 걸어가서 for 루프를 사용하여 우유를 수집하세요.
yield 구문 덕분에 발전기에서 생성된 값은 for 루프에서 직접 읽을 수 있습니다. collect() 함수를 사용하여 기계에서 "milk" 를 얻는 for 루프를 설정하세요. 그런 다음 각 병에 저장된 우유의 양을 확인하기 위해 speak() 를 사용하세요. 예를 들어:
for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))
이 for 루프를 두 X 표시에 대해 작성하고 사용하세요. 밝은 X 표시는 tank_a 인수를 사용하고 어두운 X 표시는 tank_b 인수를 사용하여 레벨을 완료하세요.