Продвинутый курс разработки на Python
Глава
>
Уровень
Генераторы
Создание генератора
Иногда вам может понадобиться генерировать значения последовательно, а не получать одноразовый результат. Подобно тому, как работают функции, генераторы пишутся и выполняются одинаковым образом, за исключением того, что они используют yield() вместо return(), когда производят результат.
В этом упражнении вы должны наполнять бутылки молоком из цистерн на ферме. Используйте генератор для итерации наполнения бутылок и убедитесь, что излишки молока собираются из цистерн.

Цель
Заполните бутылки молоком, перекачивая молоко из баков с помощью генераторов.
Машины для хранения коровьего молока почти полные, вам нужно разлить молоко по бутылкам и сохранить его, прежде чем оно испортится. Это может быть немного сложной задачей при использовании обычных средств, и количество молока, которое вы можете извлечь, может варьироваться. К счастью, вы можете использовать генераторы, чтобы сделать этот процесс лёгким и простым.
Есть два (2) бака с молоком, которые нужно откачать и разлить по бутылкам. Каждая машина имеет отсеки для хранения молока, они представлены константами списка с именами: tank_a и tank_b. Кроме того, в каждом баке, как правило, остаётся избыток, который вы можете собрать.
Генераторы следуют той же синтаксису, что и функции, но используют yield вместо return для вывода. Настройте генератор с именем fill() и задайте его с аргументом list, это будет место, где вы вводите упомянутые выше константы.
def fill(list):
for x in range(3):
yield list[x]
yield 5
Генератор читает данные из трёх (3) полей в константах списка, представленных отсеками в машине, и добавляет избыток, который равен пяти (5).
Соберите объект корзины на поле, чтобы получить доступ к бутылкам, необходимым для заполнения, и идите к двум (2) X-отметкам, чтобы собрать молоко с помощью цикла for.
Благодаря оператору yield значения, полученные от генератора, могут быть считаны прямо из цикла for. Настройте цикл, который использует функцию collect() для получения "молока" из машины. Затем используйте 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, чтобы завершить уровень.